Keyboard management on login screen.

This commit is contained in:
Thomas Andres Gomez 2021-05-07 17:57:08 +02:00
parent fc88b881b4
commit b05d9d0cf3
2 changed files with 32 additions and 4 deletions

2
.idea/misc.xml generated
View file

@ -79,6 +79,8 @@
<entry key="../../../../../layout/compose-model-1620400432847.xml" value="0.28125" /> <entry key="../../../../../layout/compose-model-1620400432847.xml" value="0.28125" />
<entry key="../../../../../layout/compose-model-1620400507721.xml" value="0.2962962962962963" /> <entry key="../../../../../layout/compose-model-1620400507721.xml" value="0.2962962962962963" />
<entry key="../../../../../layout/compose-model-1620400535629.xml" value="0.16300675675675674" /> <entry key="../../../../../layout/compose-model-1620400535629.xml" value="0.16300675675675674" />
<entry key="../../../../../layout/compose-model-1620401962136.xml" value="0.28125" />
<entry key="../../../../../layout/compose-model-1620402873003.xml" value="0.28125" />
<entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.2898148148148148" /> <entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.2898148148148148" />
<entry key="app/src/main/res/drawable/ic_baseline_local_library_24.xml" value="0.25462962962962965" /> <entry key="app/src/main/res/drawable/ic_baseline_local_library_24.xml" value="0.25462962962962965" />
<entry key="app/src/main/res/drawable/ic_google.xml" value="0.2962962962962963" /> <entry key="app/src/main/res/drawable/ic_google.xml" value="0.2962962962962963" />

View file

@ -4,11 +4,12 @@ import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.material.ButtonDefaults.outlinedButtonColors import androidx.compose.material.ButtonDefaults.outlinedButtonColors
import androidx.compose.material.TextFieldDefaults.outlinedTextFieldColors import androidx.compose.material.TextFieldDefaults.outlinedTextFieldColors
import androidx.compose.material.TextFieldDefaults.textFieldColors
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.sharp.Visibility import androidx.compose.material.icons.sharp.Visibility
import androidx.compose.material.icons.sharp.VisibilityOff import androidx.compose.material.icons.sharp.VisibilityOff
@ -16,8 +17,12 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
@ -63,17 +68,24 @@ fun LoginScreenComposable(
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
val focusRequester = remember { FocusRequester() }
val localFocus = LocalFocusManager.current
LoginField( LoginField(
viewModel = authenticationViewModel, viewModel = authenticationViewModel,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(bottom = 16.dp) .padding(bottom = 16.dp),
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
keyboardActions = KeyboardActions { focusRequester.requestFocus() }
) )
PasswordField( PasswordField(
viewModel = authenticationViewModel, viewModel = authenticationViewModel,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(bottom = 16.dp) .padding(bottom = 16.dp)
.focusRequester(focusRequester),
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions { localFocus.clearFocus() }
) )
CredentialRemember( CredentialRemember(
viewModel = authenticationViewModel, viewModel = authenticationViewModel,
@ -122,7 +134,12 @@ fun LoginScreenComposable(
} }
@Composable @Composable
private fun LoginField(viewModel: AuthenticationViewModel, modifier: Modifier = Modifier) { private fun LoginField(
viewModel: AuthenticationViewModel,
modifier: Modifier = Modifier,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
keyboardActions: KeyboardActions = KeyboardActions(),
) {
val login: State<String?> = viewModel.login.observeAsState() val login: State<String?> = viewModel.login.observeAsState()
TextField( TextField(
modifier = modifier, modifier = modifier,
@ -132,11 +149,18 @@ private fun LoginField(viewModel: AuthenticationViewModel, modifier: Modifier =
colors = outlinedTextFieldColors(), colors = outlinedTextFieldColors(),
maxLines = 1, maxLines = 1,
singleLine = true, singleLine = true,
keyboardOptions = keyboardOptions,
keyboardActions = keyboardActions,
) )
} }
@Composable @Composable
private fun PasswordField(viewModel: AuthenticationViewModel, modifier: Modifier = Modifier) { private fun PasswordField(
viewModel: AuthenticationViewModel,
modifier: Modifier = Modifier,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
keyboardActions: KeyboardActions = KeyboardActions(),
) {
val password = viewModel.password.observeAsState() val password = viewModel.password.observeAsState()
var passwordVisibility by remember { mutableStateOf(false) } var passwordVisibility by remember { mutableStateOf(false) }
TextField( TextField(
@ -156,6 +180,8 @@ private fun PasswordField(viewModel: AuthenticationViewModel, modifier: Modifier
) )
} }
}, },
keyboardOptions = keyboardOptions,
keyboardActions = keyboardActions,
) )
} }