Définir le focus sur EditText

179

J'ai un champ EditText et j'ai défini un OnFocusChangeListener pour cela. Lorsqu'il a perdu le focus, une méthode est appelée, qui vérifie la valeur de EditText avec un dans la base de données. Si la valeur de retour de la méthode est true, un toast est affiché et le focus doit revenir à nouveau sur EditText. Le focus doit toujours revenir sur EditText et le clavier doit s'afficher, jusqu'à ce que la valeur de retour de la méthode soit false.

EDIT: Je pense que je n'ai pas encore clarifié mon vrai problème: aucun autre élément à l'écran ne devrait pouvoir être modifié, jusqu'à ce que la valeur de EditText soit modifiée en une valeur, ce qui rend la méthode "checkLiganame (liganame) "retourne faux. Seul le champ EditText doit être modifiable.

voici mon code (qui ne fonctionne pas pour moi):

final EditText Liganame = (EditText) findViewById(R.id.liganame);

    Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {

                String liganame = Liganame.getText().toString();


                if (checkLiganame(liganame)) {
                    Toast toast = Toast.makeText(CreateTableActivity.this,
                            "Dieser Liganame ist bereits vergeben",
                            Toast.LENGTH_SHORT);
                    toast.show();
                    Liganame.requestFocus();
                }
            }

et la méthode:

public boolean checkLiganame(String liganame) {
    boolean found = false;

    DatabaseHelper databaseHelper = new DatabaseHelper(this);
    SQLiteDatabase db = databaseHelper.getReadableDatabase();

    Cursor cursor = db.query("liga", new String[] { "liganame" },
            "liganame = '" + liganame + "'", null, null, null, null);
    Log.i("Liganame: ", String.valueOf(cursor));

    db.close();
    if (cursor != null) {
        found = true;
    }

    return found;
}

Ce code conduit au résultat suivant: Une fois que le EditText a perdu le focus, le focus revient à EditText, mais je ne peux plus modifier le texte.

EDIT2: J'ai changé mon code. Scénario:

Je clique sur le premier EditText et y mets une chaîne, qui est déjà dans la base de données. Le toast montre. Maintenant, je ne peux plus modifier ma chaîne. Je clique sur "suivant" sur le clavier et le focus reste sur le premier EditText. J'essaye de modifier ma chaîne, mais rien ne se passe. Au lieu de cela, ma nouvelle chaîne s'affiche dans le deuxième EditText. Je clique sur la flèche arrière de mon appareil et reclique sur le premier et le deuxième EditText -> aucun clavier ne s'affiche.

Voici mon nouveau code:

public class CreateTableActivity extends Activity implements
    OnFocusChangeListener {

private EditText Liganame, Mannschaftsanzahl;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.create_league);

    Liganame = (EditText) findViewById(R.id.liganame);
    Liganame.setOnFocusChangeListener(this);
    Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
    Mannschaftsanzahl.setOnFocusChangeListener(this);

    final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);

    OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
            ButtonClick();
        }
    };
    save_button.setOnClickListener(mCorkyListener);



}

@Override
public void onFocusChange(View v, boolean hasFocus) {
    String liganame = Liganame.getText().toString();

    if (checkLiganame(liganame)) {
        if (Liganame.requestFocus()) {
            getWindow()
                    .setSoftInputMode(
                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            Mannschaftsanzahl.clearFocus();
            Toast.makeText(CreateTableActivity.this,
                    "Dieser Liganame ist bereits vergeben",
                    Toast.LENGTH_SHORT).show();
        }
    }
}
Erdalprinz
la source
Si les réponses ci-dessous vous sont
utiles

Réponses:

278

Mettez simplement cette ligne sur votre onCreate()

editText.requestFocus();

Ça marche pour moi, j'espère que ça aide

ralphgabb
la source
164

Demander la mise au point ne suffit pas pour afficher le clavier.

Pour vous concentrer et afficher le clavier, vous devez écrire quelque chose comme ceci:

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

EDIT: Ajout d'informations supplémentaires à la réponse après l'ajout de la méthode checkLiganame.

Dans la méthode checkLiganame, vous vérifiez si le curseur est nul. Le curseur renverra toujours un objet, donc la vérification de null ne fait rien. Cependant le problème est dans la lignedb.close();

Lorsque vous fermez la connexion à la base de données, le Cursordevient invalide et est probablement nul.

Fermez donc la base de données après avoir récupéré la valeur.

Au lieu de vérifier que le curseur est nul, vous devriez vérifier si le nombre de lignes renvoyées est supérieur à 0: if (cursor.getCount ()> 0) puis définissez votre valeur booléenne sur true si c'est le cas.

EDIT2: Voici donc un code pour le faire fonctionner. EDIT3: Désolé mauvais code j'ai ajouté ...; S

Tout d'abord, vous devez vous concentrer clairement si un autre EditTextobtient la concentration. Cela peut être fait avec myEditText.clearFocus(). Ensuite, dans votre onFocusChangeListener, vous ne devriez pas vraiment vous soucier de savoir si le premier EditTexta le focus ou non, donc le onFocusChangeListener pourrait ressembler à ceci:

public class MainActivity extends Activity implements OnFocusChangeListener {
    private EditText editText1, editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText1 = (EditText) findViewById(R.id.editText1);
        editText1.setOnFocusChangeListener(this);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText2.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        String liganame = editText1.getText().toString();

        if(liganame.length() == 0) {
            if(editText1.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                editText2.clearFocus();
                Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

Remplacez le premier chèque if(liganame.length() == 0)par votre propre chèque, alors cela devrait fonctionner. Prenez note que toutes les vues EditText devraient avoir défini onFocusChangeListenerle même auditeur que je l'ai fait dans l'exemple.

Darwind
la source
Merci jusqu'à présent. Mais cela ne résout pas tout mon problème. J'ai édité la description de mon problème.
erdalprinz
Alors, que fait checkLiganame exactement? Pourquoi ne pouvez-vous pas simplement vérifier si (liganame.isEmpty ()) et si c'est vrai, requestFocus à nouveau?
Darwind le
1
Merci :-) Maintenant, ma méthode fonctionne correctement :-) mais mon problème principal avec le champ EditText n'est pas encore résolu. Je ne peux toujours pas le modifier, après que la méthode a trouvé une ligne ...
erdalprinz
Vous avez donc ajouté if (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } Dans l'auditeur onFocusChanged?
Darwind
Oui je l'ai fait. Sous Liganame.requestFocus () ;. Je clique sur "suivant" sur le clavier, pour sauter dans le champ EditText suivant. Le toast est affiché et le focus est sur LES DEUX Champs EditText. Mais je ne peux éditer que le second. Le premier, qui devrait être le seul à avoir le focus dans ce cas, n'est plus modifiable.
erdalprinz
59

Le code Darwind n'a pas montré le clavier.

Cela fonctionne pour moi:

        _searchText.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);

au cas où le clavier ne s'affiche pas, essayez de forcer:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
Groco
la source
19

Cela modifie le focus du EditText lorsque le bouton est cliqué:

public class MainActivity extends Activity {
    private EditText e1,e2;
    private Button b1,b2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1=(EditText) findViewById(R.id.editText1);
        e2=(EditText) findViewById(R.id.editText2);
        e1.requestFocus();
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e1.requestFocus();

            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e2.requestFocus();
            }
        });
    }
}
Simon Chius
la source
16

Cela fonctionne de moi:

public void showKeyboard(final EditText ettext){
    ettext.requestFocus();
    ettext.postDelayed(new Runnable(){
            @Override public void run(){
                InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(ettext,0);
            }
        }
        ,200);
}

Cacher:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}
Guru raj
la source
1
Pourquoi avez-vous besoin d'attendre 200 ms? est-ce nécessaire ou puis-je simplement le montrer immédiatement?
Coder123
11

C'est ce qui a fonctionné pour moi, définit le focus et montre également le clavier

EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);
Berni Gf
la source
1
Merci. setFocusablenécessite l'API 26. Aussi setFocusableInTouchModen'était pas nécessaire dans mon cas.
CoolMind
8

Si nous créons dynamiquement un EditText, nous devons définir le requestFocus () comme indiqué ci-dessous.

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();

Si nous avons déjà déclaré le composant dans la vue xml, nous devons le trouver et nous pouvons le focus comme indiqué ci-dessous.

EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();

Il définit uniquement le focus sur le composant EditText correspondant.

Sudhakar
la source
6
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
Barakzai
la source
4
    Button btnClear = (Button) findViewById(R.id.btnClear);

    EditText editText1=(EditText) findViewById(R.id.editText2);
    EditText editText2=(EditText) findViewById(R.id.editText3);

    btnClear.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            editText1.setText("");
            editText2.setText("");

            editText1.requestFocus();
        }
    });
Prince
la source
3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);

la source
2

Vous pouvez le faire avec une seule ligne:

yourEditText.RequestFocusFromTouch();
daniel alexandru ganea
la source
En fait, c'est la seule réponse qui a fonctionné pour moi. Il simule le toucher comme je le voulais.
Antonio Vlasic
2

Pour Xamarin.Android, j'ai créé cette extension.

public static class ViewExtensions
{
    public static void FocusEditText(this EditText editText, Activity activity)
    {
        if (editText.RequestFocus())
        {
            InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
            imm.ShowSoftInput(editText, ShowFlags.Implicit);
        }
    }
}
c.lamont.dev
la source
2

veuillez essayer ce code sur le manifeste

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>
Felix Cruz
la source
2

Si vous essayez d'appeler requestFocus()avant que la mise en page ne soit gonflée, elle retournera false. Ce code s'exécute une fois la mise en page gonflée. Vous n'avez pas besoin de 200 ms de retard comme mentionné ci - dessus .

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})
Mücahit Şenol
la source
1

Je ne sais pas si vous avez déjà trouvé une solution, mais pour votre problème d'édition après avoir demandé à nouveau la mise au point:

Avez-vous essayé d'appeler la méthode selectAll()ou setSelection(0)(si c'est emtpy) sur votre edittext1?

S'il vous plaît laissez-moi savoir si cela aide, donc je modifierai ma réponse pour une solution complète.

Incontesté
la source
1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 
user5176384
la source
0

Si l'utilisation de requestFocus()dans onCreate()introduit le problème du clavier qui ne s'affiche pas au toucher, utilisez en BindingAdapterutilisant un SingleLiveEvent et demandez le focus à l'intérieur.

Voici comment procéder:

BindingAdapter

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}
Yogesh Umesh Vaity
la source
0

Ma réponse ici

Comme je l'ai lu sur le document officiel, je pense que c'est la meilleure réponse, il suffit de passer le paramètre View to tel que votre EditText, mais showSoftKeyboard semble ne pas fonctionner sur le paysage

private fun showSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

private fun closeSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}
Thành Thỏ
la source