You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
csamsclient/app/src/main/java/com/gyf/csams/MainActivity.kt

162 lines
5.1 KiB

package com.gyf.csams
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.viewmodel.compose.viewModel
import com.gyf.csams.account.model.RegisterViewModel
import com.gyf.csams.ui.theme.CSAMSTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
CSAMSTheme {
// A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) {
Register()
}
}
}
}
}
/**
* 注册表单
*
*/
@Composable
fun Register(registerViewModel: RegisterViewModel=viewModel()){
Row (
horizontalArrangement=Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxSize()) {
Column {
val name:String by registerViewModel.name.observeAsState("")
Text(buildAnnotatedString {
withStyle(style = MaterialTheme.typography.subtitle1.toSpanStyle()
.copy(color = MaterialTheme.colors.primary)){
append(name)
}
withStyle(style = MaterialTheme.typography.subtitle1.toSpanStyle()){
append("同学您好\n")
}
withStyle(style = MaterialTheme.typography.subtitle2.toSpanStyle()){
append("欢迎使用")
}
withStyle(style = MaterialTheme.typography.subtitle2.toSpanStyle()
.copy(color=MaterialTheme.colors.secondary)){
append(BuildConfig.APP_NAME)
}
})
StudentId()
Name(name)
}
}
}
/**
* 限制文本框最小宽度
*
* @param modifier
* @param content
*/
@Composable
fun BaseColumn(modifier: Modifier = Modifier,content:@Composable ColumnScope.() -> Unit){
Column(modifier = modifier.width(IntrinsicSize.Min),content = content)
}
/**
* 学号
*
* @param registerViewModel
*/
@Composable
fun StudentId(registerViewModel: RegisterViewModel=viewModel()){
BaseColumn {
val studentId: String by registerViewModel.studentId.observeAsState("")
val isValidStudentId : Boolean by registerViewModel.isValidStudentId.observeAsState(false)
val focusManager = LocalFocusManager.current
OutlinedTextField(
value = studentId,
onValueChange = { registerViewModel.onStudentIdChange(it) },
label = { Text(text = registerViewModel.studentIdDesc) },
placeholder = { Text(text = registerViewModel.studentIdPlaceholder) },
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
keyboardOptions = KeyboardOptions.Default.copy( keyboardType = KeyboardType.Number,imeAction = ImeAction.Done),
singleLine = true,
isError = !isValidStudentId
)
if (!isValidStudentId) {
Text(
text = registerViewModel.studentIdFormat,
color = MaterialTheme.colors.error
)
}
}
}
/**
* 姓名
*
* @param registerViewModel
*/
@Composable
fun Name(name:String,registerViewModel: RegisterViewModel=viewModel()){
BaseColumn {
val isValidName:Boolean by registerViewModel.isValidName.observeAsState(false)
val focusManager = LocalFocusManager.current
OutlinedTextField(value = name,
onValueChange = {registerViewModel.onNameChange(it)},
label={ Text(text = registerViewModel.nameDesc)},
placeholder = { Text(text = registerViewModel.namePlaceholder)},
singleLine = true,
isError = !isValidName,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done))
if (!isValidName){
Text(text = registerViewModel.nameFormat,
color=MaterialTheme.colors.error)
}
}
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
CSAMSTheme {
Register()
}
}