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 éviter cela?
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 éviter cela?
Réponses:
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, cela ne fonctionne pas, ScrollView
vous devez donc ajouter ces attributs à l'enfant principal de ScrollView
.
Vous pouvez ajouter ceci à votre activité de manifeste Android:
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
J'ai plusieurs implémentations décrites ici, mais maintenant j'ai ajouté dans le AndroidManifest.xml
pour ma Activity
propriété:
android:windowSoftInputMode="stateAlwaysHidden"
fragments
." stateAlwaysHidden " Le clavier virtuel est toujours masqué lorsque la fenêtre principale de l'activité a le focus d'entrée.
Si vous avez une autre vue de votre activité comme un ListView
, vous pouvez également faire:
ListView.requestFocus();
dans votre onResume () pour récupérer le focus du fichier editText
.
Je sais que cette question a reçu une réponse, mais je propose simplement 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 ce 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 lors du changement d'onglets, 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 le onCreate () et dans le 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 chacun EditText
dans le OnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
Et pour chacun EditText
dans le layout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
Il y a probablement plus d'optimisation de code 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 mise en page parent:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
Et maintenant, lorsque l'activité démarre, cette mise en page principale sera mise au point par défaut.
En outre, nous pouvons supprimer le focus des vues enfants 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.
c'est la solution que j'utilise, ce n'est pas la meilleure solution mais ça marche 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;
}});
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é à un champ de texte, le clavier logiciel n'est pas affiché (puis passe à vous montre comment afficher le clavier si vous le souhaitez avec du code).
Sur mon Samsung Galaxy S5, voici comment fonctionne mon application (sans entrée manifeste ni code spécifique) - pas de clavier logiciel. Cependant, sur un Lollipop AVD, un clavier virtuel est affiché - contrairement à la doc donnée ci-dessus.
Si vous obtenez ce comportement lors d'un test dans un AVD, vous souhaiterez peut-être effectuer un test sur un appareil réel pour voir ce qui se passe.
Cela a de bonnes réponses à l'article suivant: Arrêtez 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ément factice doit être PLACÉ AVANT l'élément focalisable.
Et je pense que cela devrait fonctionner parfaitement même avec ScrollView et que cela n'a pas non plus eu de problèmes d'accessibilité.
Cela se produit lorsque votre EditText obtient automatiquement le focus au début de votre activité. Donc, un moyen simple et stable de résoudre ce problème consiste simplement à définir le focus initial sur n'importe quelle autre vue, telle qu'un bouton, etc.
Vous pouvez le faire dans votre mise en page XML, aucun code requis.
La réponse acceptée ne fonctionne pas pour moi, c'est pourquoi donner une solution de travail de réponse, cela peut être 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 profitez :)
android: windowSoftInputMode = "stateHidden | AdjustResize"
Fonctionne bien
android:focusableInTouchMode="true"
Ajoutez la ligne ci-dessus au xml de EditText
ou TextInputLayout
qui a le focus et provoque lesoftInputKeyboard
apparaître le.
Cela a résolu le problème pour nous et maintenant le clavier ne s'affiche pas
search_edit_text = (EditText) findViewById (R.id.search_edit_text);
search_edit_text.requestFocus();
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
Cela fonctionne pour moi, les fragments peuvent avoir une syntaxe différente. CELA FONCTIONNE POUR L'ACTIVITÉ
Si votre vue contient EditText et Listview, le clavier s'ouvrira par défaut. Pour empêcher le clavier de s'afficher par défaut, procédez comme suit
this.listView.requestFocus();
Assurez-vous que vous demandez le focus sur la liste après avoir obtenu la vue pour editText.
Pour par exemple
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
Si vous le faites, editText obtiendra le focus et le clavier apparaîtra.