2010-03-15 5 views
0

Je souhaite pouvoir fermer la boîte de dialogue editpreference (comme illustré ici http://twitpic.com/18ttdp) en appuyant sur le bouton 'Terminé' du clavier.Quitter la boîte de dialogue des préférences android sur le clavier ACTION_DONE appuyer sur

Actuellement, en appuyant sur 'Terminé', vous fermez simplement le clavier mais quitte le dialogue.

Dans d'autres parties de mon application, j'utiliser un code similaire à ce qui suit pour intercepter le « Terminé » appuyer sur la touche et exécuter des actions dans mon activité:

text.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (actionId == EditorInfo.IME_ACTION_DONE) { 
       //do stuff here 
       return true; 
      } 
      return false; 
     } 
    }); 

Cependant, je ne suis pas sûr de la façon de faire parvenir même effet dans mon activité de préférence ou ma mise en page xml.

+0

Pouvez-vous passer le même événement qui se produit lorsque vous cliquez sur le bouton "OK" de la boîte de dialogue lorsque vous interceptez la touche "Terminé"? – Feet

+0

Comment je fais ça? – Damian

+0

ce lien peut aider http://stackoverflow.com/questions/11236264/change-action-of-done-button-on-virtual-keyboard-android/27035143#27035143 – Nepster

Répondre

0

Au lieu d'ajouter l'auditeur là-bas, vous devriez faire quelque chose de similaire à ceci:

getDialog().setOnKeyListener(new OnKeyListener() { 

    @Override 
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
     dialog.dismiss(); 
     return true; 
    } 
}); 

Ce code rejettera la boîte de dialogue lorsqu'une touche est enfoncée.

+0

Merci, cela rejette le dialogue, mais ne conserve pas le valeur. Si j'obtiens l'accès aux préférences partagées (SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences (this);) dans la boîte de dialogue et stockez la valeur du champ de texte avant qu'il ne soit ignoré, la nouvelle valeur est enregistrée. Cependant, lorsque vous cliquez à nouveau sur la préférence, l'ancienne valeur est affichée (elle est en quelque sorte mise en cache). Je dois quitter l'écran des préférences, puis sélectionner préférences -> pref_option pour que la nouvelle valeur sauvegardée soit affichée. Comment réparer cette partie? – Damian

+0

Je devrais vous avertir que je ne le ferais pas. Je pense que cela rendra votre interface utilisateur non intuitive. Si vous voulez le faire, essayez d'ajouter quelque chose comme persistString (mValue); à ce code. – Macarse

+0

J'ai utilisé prefs.edit.putString() (persistString est une méthode protégée). Comme je le dis, il stocke effectivement la valeur, mais l'ancienne valeur (mise en cache) est affichée si je sélectionne à nouveau la préférence immédiatement après avoir quitté la boîte de dialogue (à partir du clavier). Est-il possible de rafraîchir la valeur lorsque le dialogue est affiché? – Damian

0

J'ai eu le même problème, voici comment je l'ai résolu:

// edit text to get input 
    final EditText input = new EditText(this); 
    //input.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); 
    input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE); 
    alert.setView(input); 

    // ok button 
    alert.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      // do stuff 
     } 
    }); 

Pour mes besoins, l'entrée était un certain nombre (d'où la ligne est commentée) mais si vous voulez utiliser du texte ce qui est là.

0

Voici comment je l'ai résolu:

final EditTextPreference namePref = (EditTextPreference) findPreference("name"); 
    namePref.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if(actionId == EditorInfo.IME_ACTION_DONE) { 
       namePref.onClick(null, DialogInterface.BUTTON_POSITIVE); 
       namePref.getDialog().dismiss(); 
       return true; 
      } 
      return false; 
     } 
    }); 

Mais vous pouvez envisager EditTextPreference le sous-classement à la place, étant donné que cet appel onclick est un hack, et sa mise en œuvre peut changer à l'avenir.

Questions connexes