Android: EditText dans la boîte de Dialogue n'a pas tirer vers le haut du clavier virtuel
J'ai donc obtenu ce qui semble être un problème commun, qui est que l'EditText dans ma boîte de dialogue ne s'affiche pas lorsqu'il obtient le focus. J'ai vu plusieurs solutions de contournement, comme dans ce fil, cette une et cette une (et beaucoup plus), mais je n'ai jamais vu une explication satisfaisante pour pourquoi ce qui se passe dans la première place.
Je préférerais de beaucoup avoir android utiliser son propre comportement par défaut pour EditTexts que de construire mon propre, mais il semble que tout le monde (dans les discussions) a admis que le comportement par défaut pour EditTexts dans les boîtes de dialogue est tout simplement un curseur et pas de clavier. Pourquoi serait-elle?
Pour l'enregistrement, aucune de ces solutions semblent être de travailler pour moi - le plus proche, j'ai été en mesure de venir oblige, un clavier apparaît sous la boîte de dialogue (à l'aide de InputMethodManager.toggleSoftKeyboard(*)). Ma configuration est API15, l'EditText affiche dans un pied de page sur une ListView dans un AlertDialog. L'EditText android:focusable="true" est réglé, et onFocusChangeListener est recevoir des événements de focus.
Edit:
Comme demandé, voici l'extrait de code que je travaille avec. Je ne vais pas l'embêter avec toute la mise en page, mais dans cette application particulière, le EditText apparaît dans la réponse à appuyer sur un bouton de la boîte de dialogue (similaire à une action en vue). Elle est contenue dans un RelativeLayout qui a par défaut la visibilité "disparu":
<RelativeLayout
android:id="@+id/relLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp">
<ImageButton
android:id="@+id/cancelBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@color/transparent"
android:src="@drawable/cancelButton"
android:layout_margin="5dp"/>
<ImageButton
android:id="@+id/okBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/cancelBut"
android:background="@color/transparent"
android:src="@drawable/okButton"
android:layout_margin="5dp" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:focusable="true"
android:layout_toLeftOf="@id/okBut"/>
</RelativeLayout>
Le code qui construit cette définit la visibilité de la relativeLayout à "Visible" (et cache les autres éléments de l'INTERFACE utilisateur). Cette devrait sera suffisant pour tirer vers le haut du clavier lorsque l'EditText obtient ciblée, basée sur mon expérience avec EditText. Cependant, pour certaines raisons, ce n'est pas le cas. J'pouvez définir les options suivantes onFocusChangeListener:
edit_text.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
//For whatever reason we need to request a soft keyboard.
InputMethodManager imm = (InputMethodManager)dlg.getWindow().getContext().getSystemService(_Context.INPUT_METHOD_SERVICE);
if(hasFocus)
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Log.v("DialogProblem", "Focus requested, " + (hasFocus?"has focus.":"doesn't have focus."));
}
}
});
En utilisant cette configuration, lorsque je première entrer dans l'EditText, le onFocusChangedListener déclenche, et génère un journal qui, invariablement, ressemble à ceci:
Focus requested, has focus.
Focus requested, doesn't have focus.
Focus requested, has focus.
Le clavier s'affiche puis disparaît, probablement parce que je bascule à deux reprises, mais même quand je fais en sorte qu'il reste en place, c'est derrière la fenêtre de dialogue (en grisé) et il n'y a aucun moyen de l'obtenir sans fermer la boîte de dialogue.
Cela dit, je tiens à souligner que, même si je vais peut-être en mesure d'obtenir ce travail autour de travail, je suis principalement intéressés à trouver une raison simple pourquoi l'EditText n'est pas le déclenchement, en premier lieu, et pourquoi cela semble si banale!
- Pourriez-vous poster le code snippet (où vous mettez le focus, ajouter un accent à l'écoute, etc)?
- Je peux (et quand je serai de retour à un ordinateur), mais je pense que ma question plus générale n'implique pas l'accent de l'auditeur. Je me demandais pourquoi il semble être un problème commun que de modifier du texte dans une boîte de dialogue ne s'ouvre pas le clavier. Alors que je me ferais un plaisir d'utiliser un kluge si c'est la façon de le faire, mais j'aimerais savoir pourquoi une telle chose est nécessaire.
Vous devez vous connecter pour publier un commentaire.
OK, donc après avoir lu beaucoup, j'ai compris pourquoi c'est un problème, et je ne pas besoin d'utiliser des solutions de contournement.
Le problème semble être (au moins dans mon cas), que, depuis l'endroit où vous entrez le texte est masqué initialement (ou imbriquées ou quelque chose), AlertDialog est automatiquement le paramétrage de l'indicateur WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM (ou une combinaison de cela et WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE), de sorte que les choses ne vont pas déclencher une douce entrée de montrer.
La façon que j'ai trouvé pour résoudre ce problème est d'ajouter la ligne suivante après la boîte de dialogue a été créé:
Une fois que c'est fait, l'EditText agit comme un normal EditText, pas de kludges ou les solutions de rechange nécessaires.
clearFlags()
aprèsshow()
, merci @AlexanderFragotsisAlertDialog
est visible, il est donc logique d'exécuter cette méthode à l'intérieur d'unOnShowListener
.J'ai le même problème dans mon propre application. Si vous développez pour l'API de niveau >= 8, vous pouvez utiliser cet extrait:
Je n'ai pas trouvé une solution pour abaisser API niveaux...
BTW: Ce morceau de code ne fonctionne pas toujours sur émulateur. Je ne sais pas pourquoi.
AlertDialog dialog = builder.create();
avant etdialog.show();
après, si vous êtes en utilisant un AlertDialog.ConstructeurSi vous lisez l'AlertDialog la documentation que vous y trouverez:
J'ai eu le problème que vous avez mentionné avec EditText dans ListView à l'intérieur d'une boîte de Dialogue. Je l'ai fixée par l'écrasement de la classe de vue personnalisée (dans mon cas ListView) avec mon propre FocusableListView, avec une seule méthode écrasé:
Alors je l'utilise dans la mise en page du fichier:
Vous pouvez remplacer le RelativeLayout dans votre cas, de la même façon et cela devrait fonctionner.
Le code ci-dessus est très utile. Mais vous devez appeler la méthode "show" après le "créer" la méthode (je ne sais pas pourquoi, mais seulement cela fonctionne dans mon dialogue avec EditText dans la Liste).
Dans la méthode onCreateDialog:
Merci! J'ai intégré TextEdit dans la dernière rangée de ListView incorporé dans la boîte de dialogue d'alerte fragment. J'ai utilisé votre solution de compensation les drapeaux en tant que post-exécutables, et maintenant il fonctionne parfaitement.
C'est ce qui a fonctionné pour moi. Créer l'AlertDialog.Builder, titre du jeu, positiveButton, negativeButton. Après cela:
Vous n'avez pas besoin d'utiliser
builder.show();
.Voici une façon de le faire:
Je tiens à ajouter sur Paul réponse et Alexander commentaire.
J'ai moi-même une boîte de dialogue qui est créé dans le
onCreateDialog()
méthode, qui (semble) exiger le retourdialog.show();
, c'est pourquoi vous ne pouvez pas ajouter de la layoutparams à la boîte de dialogue où le dialogue est créé. Pour contourner ce problème, il suffit de garder votreonCreateDialog()
méthode le même, et ajouter unonResume()
méthode comme suit:Cela devrait faire l'affaire, ça fonctionne pour moi, heureusement. Ont été sur cette affaire depuis longtemps.
plein de code pour afficher le clavier dans la boîte de dialogue: