Question

Je développe une application Android et j'ai un EditText et un deux RadioButtons (UN et B ),

ce que j'essaie de faire c'est :

Quand RadioButton A est coché , je veux modifier la disposition du clavier pour l’afficher avec le bouton Terminé , Lorsque l' RadioButton B est coché, je souhaite modifier la disposition du clavier pour l'afficher avec le bouton Rechercher.

J'ai essayé de changer le IMEOptions de mon EditText comme ça, mais ça ne marche toujours pas :

Attention :le clavier est déjà visible, ce que je veux faire c'est simplement modifier le bouton Recherche avec le bouton Fait dans chacun des deux cas radioButtons

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(btnA.isChecked() ) { 
        txtSearch.setImeOptions(EditorInfo.IME_ACTION_DONE);
//      txtSearch.invalidate(); 
    }
    else {
        txtSearch.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
//      txtSearch.invalidate();
    }   
}

des idées sur la façon de faire ça ??

Merci d'avance.

Était-ce utile?

La solution

Quelle version d'Android ciblez-vous ?Je ne parviens pas à poster de commentaire désolé (nouveau compte), mais je suis actuellement en train de réaliser un test pour répondre à votre question.

MODIFIER: Ok, j'ai compris.Après une petite recherche sur Google (voir ce problème) et le codage, j'ai trouvé que les imeOptions semblent être mises en cache/liées à la méthode de saisie.Je ne sais pas s'il s'agit d'un bug ou d'une fonctionnalité intentionnelle.Pour changer de clavier lorsque l'utilisateur appuie sur l'un des boutons radio, assurez-vous d'abord que le inputType est défini pour votre EditText (android:inputType="text"), puis utilisez ce qui suit dans votre onCreate méthode:

final RadioGroup btn_group = (RadioGroup) findViewById(R.id.btn_group);
final RadioButton btnA = (RadioButton) findViewById(R.id.btnA);
final RadioButton btnB = (RadioButton) findViewById(R.id.btnB);

btn_group.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        final EditText txtSearch = (EditText) findViewById(R.id.edit_text);

        txtSearch.setInputType(InputType.TYPE_NULL);

        if(btnA.isChecked()) {
            txtSearch.setImeOptions(EditorInfo.IME_ACTION_DONE);
        } else {
            txtSearch.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
        }

        txtSearch.setInputType(InputType.TYPE_CLASS_TEXT);
    }
});

Notez l’annulation et la réinitialisation du InputType.

Enfin, sachez que de nombreuses implémentations de clavier populaires ne se soucient pas de ce que vous définissez. imeOptions à, alors ne comptez pas sur cette fonctionnalité dans votre application.Swype par exemple ;

En conclusion (vous voyez ce que j'ai fait là-bas ?), pour ne pas être en reste, j'ai regroupé mon programme de tests.Vous pouvez le trouver ici: http://dl.dropbox.com/u/52276321/ChangeKeyboardTest.zip

Autres conseils

essayez d'utiliser le gestionnaire de classe pour mettre à jour les vues de manière dynamique.

depuis: Modifier le texte du bouton sur Android

essaye ça RadioGroup.Cela fonctionnera certainement.OU utilisez le lien

https://gist.github.com/475320

// This will get the radiogroup
RadioGroup rGroup = (RadioGroup)findViewById(r.id.radioGroup1);
// This will get the radiobutton in the radiogroup that is checked
RadioButton checkedRadioButton = (RadioButton)rGroup.findViewById(rGroup.getCheckedRadioButtonId());


// This overrides the radiogroup onCheckListener
rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
    public void onCheckedChanged(RadioGroup rGroup, int checkedId)
    {

    switch(checkedId){
        case R.id.btnA:
            txtSearch.setImeOptions(EditorInfo.IME_ACTION_DONE);
            break;
        case R.id.btnB:
             txtSearch.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
            break;enter code here
        default:
            break;
    }
       txtSearch.setCloseImeOnDone(true); // close the IME when done is pressed
    }
});

En me tenant debout sur les épaules de géants, voici ce que j'ai trouvé.Merci à @aaronsnoswell.

private void imeSetup(boolean isDoneOk){
    if (isDoneOk!=lastIsDoneOk) {
        int inputType = editText.getInputType();
        int selectionStart = editText.getSelectionStart();
        editText.setInputType(InputType.TYPE_NULL);
        if (isDoneOk)
            editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
        else
            editText.setImeOptions(EditorInfo.IME_ACTION_NEXT);
        editText.setInputType(inputType);
        editText.setSelection(selectionStart);
        lastIsDoneOk = isDoneOk;
    }
}

Sans le lastIsDoneOk manigances, je suis entré dans une boucle infinie.YMMV parce que j'appelle cela depuis un TextWatcher, vous n'en aurez donc peut-être pas besoin.Sans suivre selectionStart, Android ramène le curseur au début.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top