web-dev-qa-db-fra.com

Le focus de la demande EditText ne fonctionne pas

J'ai un EditText et un Button. En cliquant sur le bouton, je veux ouvrir le clavier EditText tout en demandant de se concentrer sur la EditText, de sorte que l'utilisateur commence directement à taper le clavier et le texte apparaît dans la EditText. le bouton ouvre le clavier, mais il ne va pas activer la EditText, à cause de quel utilisateur doit cliquer à nouveau sur la EditText pour écrire dessus. Quelle est la solution. Toute aide ou suggestion.

Code sur le clic du bouton

m_SearchEditText.requestFocus();
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(m_SearchEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
20
Rahul

assurez-vous que le edittext est activable en mode tactile. Vous pouvez le faire dans les deux sens. 

En XML:

Android:focusableInTouchMode="true"

en Java:

view.setFocusableInTouchMode(true);

Personnellement, je ne fais pas confiance à la définition XML de ce paramètre. Je demande toujours le focus par ces deux lignes de code:

view.setFocusableInTouchMode(true);
view.requestFocus();

Le clavier doit apparaître sur lui-même sans qu'il soit nécessaire d'appeler InputMethodManager.

Cela fonctionne dans la plupart des cas. Une fois que cela n’a pas fonctionné pour moi car j’ai perdu la référence à l’objet en raison d’un traitement assez lourd, assurez-vous que ce n’est pas votre problème.

32
Jacek Milewski

Dans mon cas, cela a fonctionné en ajoutant un gestionnaire après que vous ayez cliqué sur le bouton et que le focus ait été défini dans une autre vue, le focus peut revenir à votre vue souhaitée.

il suffit de mettre ceci dans votre code:

final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        lastview.getEditText().clearFocus();
                        m_SearchEditText.requestFocus();
                        InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);


                        mgr.showSoftInput(mLastNameET, InputMethodManager.SHOW_IMPLICIT);

                    }
                }, 100);

J'espère que c'était utile

11
saleh sereshki

Dans votre manifest.xml write:

<activity Android:name=".MainActivity"
Android:label="@string/app_name"
Android:windowSoftInputMode="stateAlwaysVisible" />

Et appelez m_SearchEditText.requestfocus() dans oncreate().
OU,
Essayer: 

if(m_SearchEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
6
ridoy

Ce qui suit fonctionne pour moi et devrait aider:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
6
S.A.Norton Stanley

En tant qu'extension de cette réponse (je ne l'ai pas ajouté en tant que commentaire en raison de sa réputation ...).

Si vous souhaitez réduire le délai à zéro, utilisez handler.post () à la place de . Code complet:

final Handler handler = new Handler();
handler.post(new Runnable() {
    @Override
    public void run() {
        lastview.getEditText().clearFocus();
        m_SearchEditText.requestFocus();
        InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);


        mgr.showSoftInput(mLastNameET, InputMethodManager.SHOW_IMPLICIT);
    }
});
2
Matias Olocco

Version de l'extension Kotlin minimaliste parce que nous devrions prétendre que ces sortes d'appels obtus dans les services système ne sont pas nécessaires:

fun EditText.requestKeyboardFocus() {
    val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
1
methodsignature

Vous avez également besoin de deux attributs XML pour y parvenir:

Android:focusable="true"
Android:focusableInTouchMode="true"

Ajoutez-les à l'EditText ainsi qu'aux dispositions parentales (Toute disposition à l'intérieur de laquelle ces vues sont). Par défaut, elles sont fausses. Par conséquent, la vue demandée n'est pas activée.

Source: https://developer.Android.com/reference/Android/view/View.html#attr_Android:focusable

Après que vous ayez affiché le texte d'édition en fonction de la sélection de case à cocher, ajoutez dynamiquement les points de focus précédents et précédents dans le code.

J'espère que cela t'aides.

0
vibhor_shri