J'ai une question relativement simple. J'ai une activité avec beaucoup d'EditText en eux. Lorsque j'ouvre l'activité, elle se concentre automatiquement sur le premier EditText et affiche le clavier virtuel.
Comment puis-je empêcher cela?
Utilisez ces attributs dans votre balise de mise en page dans un fichier XML:
Android:focusable="true"
Android:focusableInTouchMode="true"
Comme indiqué par d'autres membres dans les commentaires, il ne fonctionne pas sur ScrollView
et vous devez donc ajouter ces attributs à l'enfant principal de ScrollView
.
Vous pouvez ajouter ceci à votre activité Manifest Android:
Android:windowSoftInputMode="stateHidden|adjustResize"
J'ai plusieurs implémentations décrites ici, mais maintenant j'ai ajouté dans le AndroidManifest.xml
pour ma Activity
la propriété:
Android:windowSoftInputMode="stateAlwaysHidden"
fragments
."stateAlwaysHidden" Le clavier logiciel est toujours masqué lorsque le La fenêtre principale de l'activité a le focus d'entrée.
Si vous avez une autre vue de votre activité comme une ListView
, vous pouvez aussi faire:
ListView.requestFocus();
dans votre onResume () pour obtenir le focus de editText
.
Je sais que cette question a été résolue mais fournit juste une solution alternative qui a fonctionné pour moi :)
https://stackoverflow.com/a/11627976/5217837 C'est presque correct:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Mais cela devrait être SOFT_INPUT_STATE_HIDDEN plutôt que SOFT_INPUT_STATE_ALWAYS_VISIBLE
Utilisez ceci dans le code de votre activité:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
J'ai eu un problème similaire, même en changeant de tabulation, le clavier est apparu automatiquement et est resté en place, avec Android 3.2.1 sur une tablette. Utilisez la méthode suivante:
public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
} else {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
}
}
Dans onCreate () et onPause () de l'activité pour chaque EditText:
setEditTextFocus (myEditText, false);
Pour chaque EditText un OnTouchListener:
myEditText.setOnTouchListener(new EditText.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setEditTextFocus(myEditText, true);
return false;
}
});
Pour chaque EditText
dans OnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
Et pour chaque EditText
dans le layout xml
:
Android:imeOptions="actionDone"
Android:inputType="numberDecimal|numberSigned" // Or something else
Il y a probablement plus de code à optimiser possible.
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
J'ai trouvé cette solution simple qui a fonctionné pour moi. Définissez ces attributs dans votre présentation parent:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/mainLayout"
Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true" >
Et maintenant, quand l'activité commence, cette disposition principale aura le focus par défaut.
De même, nous pouvons supprimer le focus des vues enfant au moment de l'exécution en redonnant le focus à la disposition principale, comme ceci:
findViewById(R.id.mainLayout).requestFocus();
J'espère que cela fonctionnera pour vous.
Fait intéressant, cette documentation https://developer.Android.com/training/keyboard-input/visibility.html indique que lorsqu'une activité démarre et que le focus est donné sur un champ de texte, le clavier logiciel n'est pas affiché (et continue ensuite pour vous montrer comment afficher le clavier si vous voulez utiliser du code).
Sur mon Samsung Galaxy S5, voici comment fonctionne mon application (sans saisie de manifeste ni code spécifique) - sans clavier logiciel. Cependant, sur un AVD Lollipop, un clavier logiciel est affiché, ce qui contrevient à la documentation donnée ci-dessus.
Si vous rencontrez ce problème lors d'un test sur un DAV, vous pouvez tester sur un périphérique réel pour voir ce qui se passe.
Cela a quelques bonnes réponses au post suivant: Empêchez EditText de se concentrer au démarrage de l’activité . Celui que j'utilise régulièrement est le code suivant de Morgan :
<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:layout_width="0px"
Android:layout_height="0px"/>
<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView Android:id="@+id/autotext"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:nextFocusUp="@id/autotext"
Android:nextFocusLeft="@id/autotext"/>
REMARQUE: L'élément factice doit être placé juste avant l'élément à activer.
Et je pense que cela devrait fonctionner parfaitement, même avec ScrollView, et que cela n’a eu aucun problème d’accessibilité.
c’est la solution que j’utilise, ce n’est pas la meilleure solution mais elle fonctionne bien pour moi
editComment.setFocusableInTouchMode(false);
editComment.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event)
{
// TODO Auto-generated method stub
editComment.setFocusableInTouchMode(true);
editComment.requestFocus() ;
return false;
}});
Android: windowSoftInputMode = "stateHidden | adjustResize"
Fonctionne bien
Réponse acceptée ne fonctionne pas pour moi, c'est pourquoi donner une réponse solution de travail, peut-être que c'est utile!
EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
Maintenant, le clavier est ouvert profiter :)
Ajoutez le code ci-dessous en haut de l’activité XML et assurez-vous que la vue est au-dessus de EditText
<View
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:focusableInTouchMode="true"/>
Android:focusableInTouchMode="true"
Ajoutez la ligne ci-dessus au xml de EditText
ou TextInputLayout
qui a le focus et fait apparaître la softInputKeyboard
.
Cela a résolu le problème pour nous et maintenant le clavier ne s'affiche plus
Cela se produit lorsque votre EditText obtient automatiquement le focus comme lorsque votre activité commence. Un moyen simple et stable de résoudre ce problème consiste donc simplement à définir le focus initial sur une autre vue, telle qu'un bouton, etc.
Vous pouvez le faire dans votre mise en page XML, aucun code requis ..