L'effet d'affichage normal devrait être comme ceci:
Le système affiche des anomalies dans la version 9.0, les symptômes sont les suivants:
On constate que les deux zones de saisie ci-dessus s'affichent en temps réel lors de la saisie de caractères. Lorsque le curseur se déplace vers la zone de saisie la plus basse, le curseur cesse de battre et les caractères saisis ne s'affichent pas en temps réel. Lorsque le clavier est rétracté À ce moment-là, les personnages réapparurent.
Premièrement, il existe deux solutions:
Le premier: définissez android: windowSoftInputMode sur "AdjustResize | stateHidden" (non recommandé)
android:windowSoftInputMode="adjustResize|stateHidden"
-
<application
-
...
-
android: hardwareAccelerated = "false"
-
android: theme = "@ style / Theme.AppCompat.Light.NoActionBar">
-
<activité
-
android: name = ".activity.LoginActivity"
-
...
-
android: windowSoftInputMode = "AdjustUnspecified | stateHidden" />
-
</application>
Le second: activer l'accélération matérielle
Après mes différents tests, j'ai constaté que le problème était dû au fait que l'accélération matérielle n'était pas activée.
(WTF, il y aura des problèmes lorsque l'accélération matérielle est activée, et il y aura des problèmes s'il n'y a pas de réunion dans 9.0, WTF )
1. Activez l'accélération matérielle sous l'application (il va sans dire que ce n'est pas recommandé, mais cela fonctionne bien)
-
<application
-
...
-
android: hardwareAccelerated = "false"
-
android: theme = "@ style / Theme.AppCompat.Light.NoActionBar">
-
<activité
-
android: name = ".activity.LoginActivity"
-
...
-
android: windowSoftInputMode = "AdjustUnspecified | stateHidden" />
-
</application>
2. Activez l'accélération matérielle sous le nœud d'activité (oui, recommandé)
-
<application
-
...
-
android: hardwareAccelerated = "false"
-
android: theme = "@ style / Theme.AppCompat.Light.NoActionBar">
-
<activité
-
android: name = ".activity.LoginActivity"
-
...
-
android: hardwareAccelerated = "true"
-
android: windowSoftInputMode = "AdjustUnspecified | stateHidden" />
-
</application>
3. Activer l'accélération matérielle pour la vue spécifiée (fortement recommandé)
EidtText.setLayerType(View.LAYER_TYPE_HARDWARE,null);
Veuillez choisir l'un des trois ci-dessus en fonction de vos besoins
analyser le problème:
(Je n'ai pas trouvé la bonne direction au début et j'ai fait quelques détours. L'écriture ci-dessous est plus verbeuse, vous pouvez ignorer celles que vous n'aimez pas)
Le fichier de mise en page d'origine est le suivant:
-
<LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android"
-
android: layout_width = "match_parent"
-
android: layout_height = "match_parent"
-
android: layout_centerInParent = "true"
-
android: layout_centerHorizontal = "true"
-
android: layout_centerVertical = "true"
-
android: paddingLeft = "40dp"
-
android: paddingRight = "40dp"
-
android: background = "@ color / white_color"
-
android: focusable = "vrai"
-
android: focusableInTouchMode = "true"
-
android: gravité = "centre"
-
android: orientation = "vertical">
-
<ImageView
-
android: layout_width = "96dp"
-
android: layout_height = "94dp"
-
android: background = "# 99666666" />
-
<TextView
-
android: layout_width = "wrap_content"
-
android: layout_height = "wrap_content"
-
android: layout_marginTop = "5dp"
-
android: text = "@ string / app_name"
-
android: textColor = "# 585858"
-
android: textSize = "20sp"
-
android: visibilité = "invisible" />
-
<Disposition linéaire
-
android: layout_width = "match_parent"
-
android: layout_height = "wrap_content"
-
android: layout_marginTop = "25dp"
-
android: orientation = "vertical">
-
<TextView
-
android: layout_width = "wrap_content"
-
android: layout_height = "wrap_content"
-
android: layout_marginLeft = "5dp"
-
android: layout_marginBottom = "5dp"
-
android: text = "Enterprise ID:"
-
android: textSize = "14sp" />
-
<ImageView
-
android: id = "@ + id / iv_company"
-
android: layout_width = "40dp"
-
android: layout_height = "40dp"
-
android: padding = "4dp"
-
android: scaleType = "fitXY"
-
android: src = "@ drawable / ic_title_home_default"
-
android: visibilité = "parti" />
-
<EditText
-
android: id = "@ + id / et_company_login"
-
android: layout_width = "match_parent"
-
android: layout_height = "match_parent"
-
android: layout_marginLeft = "5dp"
-
android: background = "@ drawable / selector_login_edittext"
-
android: hint = "Veuillez saisir le numéro d'entreprise"
-
android: imeOptions = "actionNext"
-
android: lignes = "1"
-
android: padding = "10dp"
-
android: paddingLeft = "5dp"
-
android: singleLine = "true"
-
android: textColor = "# 585858"
-
android: textSize = "14sp" />
-
</LinearLayout>
-
<Voir
-
android: id = "@ + id / view_userfocus_login"
-
android: layout_width = "match_parent"
-
android: layout_height = "1dp"
-
android: background = "@ color / white_color" />
-
<Disposition linéaire
-
android: layout_width = "match_parent"
-
android: layout_height = "wrap_content"
-
android: layout_marginTop = "10dp"
-
android: orientation = "vertical">
-
<ImageView
-
android: id = "@ + id / iv_user_login"
-
android: layout_width = "40dp"
-
android: layout_height = "40dp"
-
android: padding = "4dp"
-
android: scaleType = "fitXY"
-
android: src = "@ drawable / user_white"
-
android: visibilité = "parti" />
-
<TextView
-
android: layout_width = "wrap_content"
-
android: layout_height = "wrap_content"
-
android: layout_marginLeft = "5dp"
-
android: layout_marginBottom = "5dp"
-
android: text = "Nom d'utilisateur:"
-
android: textSize = "14sp" />
-
<EditText
-
android: id = "@ + id / et_user_login"
-
android: layout_width = "match_parent"
-
android: layout_height = "match_parent"
-
android: layout_marginLeft = "5dp"
-
android: background = "@ drawable / selector_login_edittext"
-
android: hint = "Nom d'utilisateur"
-
android: imeOptions = "actionNext"
-
android: lignes = "1"
-
android: padding = "10dp"
-
android: paddingLeft = "5dp"
-
android: singleLine = "true"
-
android: textColor = "# 585858"
-
android: textSize = "14sp" />
-
</LinearLayout>
-
<Voir
-
android: layout_width = "match_parent"
-
android: layout_height = "1dp"
-
android: background = "@ color / white_color" />
-
<Disposition linéaire
-
android: layout_width = "match_parent"
-
android: layout_height = "wrap_content"
-
android: layout_marginTop = "10dp"
-
android: orientation = "vertical">
-
<ImageView
-
android: id = "@ + id / iv_password_login"
-
android: layout_width = "40dp"
-
android: layout_height = "40dp"
-
android: padding = "4dp"
-
android: scaleType = "fitXY"
-
android: src = "@ drawable / password_white"
-
android: visibilité = "parti" />
-
<TextView
-
android: layout_width = "wrap_content"
-
android: layout_height = "wrap_content"
-
android: layout_marginLeft = "5dp"
-
android: layout_marginBottom = "5dp"
-
android: text = "Mot de passe:"
-
android: textSize = "14sp" />
-
<EditText
-
android: id = "@ + id / et_password_login"
-
android: layout_width = "match_parent"
-
android: layout_height = "40dp"
-
android: layout_marginLeft = "5dp"
-
android: background = "@ drawable / selector_login_edittext"
-
android: hint = "Mot de passe"
-
android: imeOptions = "actionDone"
-
android: inputType = "textPassword"
-
android: lignes = "1"
-
android: padding = "10dp"
-
android: paddingLeft = "5dp"
-
android: singleLine = "true"
-
android: textColor = "# 585858"
-
android: textSize = "14sp" />
-
</LinearLayout>
-
<Voir
-
android: id = "@ + id / view_pwdfocus_login"
-
android: layout_width = "match_parent"
-
android: layout_height = "1dp"
-
android: background = "@ color / white_color" />
-
<TextView
-
android: id = "@ + id / btn_login"
-
android: layout_width = "match_parent"
-
android: layout_height = "wrap_content"
-
android: layout_marginTop = "30dp"
-
android: background = "@ drawable / selector_greem_btn_bg"
-
android: gravité = "centre"
-
android: padding = "8dp"
-
android: text = "Connexion"
-
android: textColor = "@ color / white_color"
-
android: textSize = "16sp" />
-
<Disposition relative
-
android: layout_width = "match_parent"
-
android: layout_height = "40dp"
-
android: layout_marginTop = "15dp">
-
<CheckBox
-
android: id = "@ + id / cb_remember_login"
-
android: layout_width = "wrap_content"
-
android: layout_height = "wrap_content"
-
android: layout_alignParentStart = "true"
-
android: layout_alignParentLeft = "true"
-
android: layout_centerVertical = "true"
-
android: background = "@ drawable / selector_remember_login"
-
android: button = "@null" />
-
<TextView
-
android: layout_width = "wrap_content"
-
android: layout_height = "wrap_content"
-
android: layout_centerVertical = "true"
-
android: layout_marginLeft = "5dp"
-
android: layout_toRightOf = "@ + id / cb_remember_login"
-
android: text = "Mémoriser le mot de passe"
-
android: textSize = "@ dimen / text_moderate_size" />
-
<Bouton
-
android: id = "@ + id / btn_config_login"
-
android: layout_width = "80dp"
-
android: layout_height = "match_parent"
-
android: layout_alignParentRight = "true"
-
android: background = "@ drawable / login_item_btn"
-
android: onClick = "onConfig"
-
android: text = "Configuration du système"
-
android: textColor = "# 149048"
-
android: textSize = "@ dimen / text_moderate_size"
-
android: visibilité = "parti" />
-
</RelativeLayout>
-
</LinearLayout>
Fichier manifeste d'origine:
-
<activité
-
android: name = ".activity.LoginActivity"
-
android: configChanges = "orientation | keyboardHidden | navigation | screenSize"
-
android: icon = "@ drawable / user_btn"
-
android: launchMode = "singleTask"
-
android: screenOrientation = "portrait"
-
android: windowSoftInputMode = "AdjustPan | stateHidden" />
同样的代码拷贝到demo里运行没有问题,项目里运行就有问题
Le fichier manifeste a ensuite été simplifié comme suit:
-
<activité
-
android: name = ".activity.LoginActivity"
-
android: windowSoftInputMode = "AdjustPan | stateHidden" />
<activity android:name=".activity.LoginActivity"/>
-
<activité
-
android: name = ".activity.LoginActivity"
-
android: windowSoftInputMode = "AdjustUnspecified | stateHidden" />
Le problème n'a pas été résolu, puis deviné:
1. Est-ce causé par du code dans le fichier java?
2. La fenêtre contextuelle du clavier bloque-t-elle la zone de saisie?
Vérifiez la première conjecture:
1. Modifiez la position du nom d'utilisateur dans la deuxième zone de saisie et le mot de passe dans la troisième zone de saisie de la mise en page. Après son exécution, vous constatez que la zone de saisie du mot de passe est normale et que la zone de saisie du nom d'utilisateur a la même problème;
2. Faites une copie de la zone de saisie du mot de passe dans la mise en page à la fin, supprimez l'ID du contrôle et après son exécution, il s'avère que les problèmes ci-dessus se sont produits dans les deux zones de mot de passe;
3. Modifiez LoginActivity comme suit:
-
public class LoginActivity étend l'activité {
-
@Passer outre
-
protected void onCreate (@Nullable Bundle savedInstanceState) {
-
super.onCreate (savedInstanceState);
-
setContentView (R.layout.activity_login);
-
}
-
}
Trouvé après l'exécution: le problème existe toujours
Conclusion: le problème n'a rien à voir avec le code java
Vérifiez la deuxième conjecture:
Placez plusieurs EditTexts côte à côte dans un LinearLayout dans le sens vertical et enveloppez un NestedScrollView dans le calque externe. Après l'exécution, un phénomène magique apparaît:
Lors de la saisie, aucun caractère n'est affiché et des caractères apparaissent dans la zone de saisie lors du balayage vers le haut, et une demi-zone de tirage est laissée au-dessus du clavier.