Désactiver la vue d'édition plein écran pour la saisie au clavier en mode paysage?

237

Sur les appareils Android qui utilisent des claviers logiciels, je veux empêcher la vue d'édition du clavier en plein écran (illustrée ci-dessous) d'apparaître en mode paysage (c'est-à-dire que je veux voir uniquement le clavier logiciel lui-même et ma vue derrière).

Je suppose que cela peut être réalisé en utilisant la setExtractViewShown(false)méthode InputMethodService, mais je ne peux pas accéder à l'instance par défaut de cela et je ne veux pas implémenter une méthode d'entrée personnalisée.

Vue d'édition plein écran Android

Modifié pour ajouter: la vue vers laquelle l'entrée va n'est pas un TextView(c'est un Viewavec une InputConnectionimplémentation personnalisée ), donc android:imeOptions="flagNoExtractUi"ne fonctionnera pas ici.

jnic
la source
Essayons de le voir. C'est bon pour toi. [Regardez celui-ci] [1] [1]: stackoverflow.com/questions/8648401/…
sonida
j'ai un problème similaire :( vous avez peut-être une idée? stackoverflow.com/questions/36914290/…
railwanderer
2
comment appliquer cela dans l'ensemble de l'application.Nous n'allons pas ajouter la valeur d'attribut dans chaque edittext en xml.
Vikas Pandey
2
La plupart des réponses ci-dessous recommandent d'utiliser flagNoExtractUiou IME_FLAG_NO_EXTRACT_UI. Cependant, dans la documentation de IME_FLAG_NO_EXTRACT_UI, qui correspond à flagNoExtractUi, il indique que «l'utilisation de cet indicateur est déconseillée et peut devenir obsolète à l'avenir», de même que flagNoFullscreenl'option recommandée.
ThomasW

Réponses:

178

J'ai finalement répondu à ma propre question:

L'interface utilisateur d'extraction (c'est-à-dire le mode d'édition plein écran) peut être désactivée au point où la connexion d'entrée est connectée:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}
jnic
la source
215
mettez simplement votre fichier xml android: imeOptions = "flagNoExtractUi"
1
jnic, où avez-vous fait cette substitution dans le code du clavier logiciel? SoftKeyboard.java? J'ai essayé le même remplacement et je me suis trompé.
14
Vous voudrez probablement ajouter le drapeau aux options au lieu de remplacer les options qui ont été passées comme ceci:outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
ObsidianX
2
@ user726518 comment appliquer cet attribut sur l'élément de zone de recherche dans la barre d'actions?
Menna-Allah Sami
1
La seule chose a fonctionné lors de l'utilisation de la vue personnalisée pour gérer le clavier. Merci!
Herman
109

Pour ce faire, accédez à l'activité xml et collez android:imeOptions="flagNoExtractUi"votre code. Mais où doit-il être collé? Regardez le code de l'exemple d'activité XML et regardez EditText:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"         
    >

    <EditText
        android:imeOptions="flagNoExtractUi"
        android:id="@+id/etTextInAct"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >   
        <requestFocus />
    </EditText>

</LinearLayout>

Si vous souhaitez plus d'options de personnalisation pour le clavier, voir http://developer.android.com/guide/topics/ui/controls/text.html

pbaranski
la source
64

ajoutez la propriété android:imeOptions="flagNoExtractUi"à chacun EditTextdans votre XMLfichier.

Michael Yaworski
la source
1
Cette réponse est trop courte et ne répond pas aux normes de qualité SO. Veuillez l'améliorer en ajoutant quelques explications supplémentaires, afin qu'il soit utile pour la communauté et pas seulement pour l'OP.
Lorenzo Donati - Codidact.org
31
@LorenzoDonati c'est exactement ce que vous avez à faire ... c'est une réponse très simple car la solution est très simple et c'est juste une manière différente de le faire que les réponses ci-dessus. De plus, les réponses ne peuvent pas être "trop ​​courtes" à moins qu'elles ne répondent pas à la question, OMI.
Michael Yaworski
1
Désolé, mais ce n'est pas ce que la communauté SO en pense. Les réponses ne devraient pas se limiter à résoudre le problème du PO, elles devraient être de bonnes réponses en général. Voir ceci et cela , par exemple.
Lorenzo Donati - Codidact.org
22
@LorenzoDonati c'est une question très spécifique avec un seul résultat final (mais plusieurs façons de le résoudre). Ma réponse est un ajout aux autres réponses de cette page. TOUTES les réponses sur cette page ne sont limitées qu'au "problème de l'OP" car c'est le seul type de réponse qui puisse être écrit. Comme je l'ai dit, c'est spécifique et simple.
Michael Yaworski
2
enfin, j'ai trouvé la réponse. merci beaucoup @mike yaworski
Drx
53

La réponse ci-dessus m'a aidé à trouver la solution pour EditTexts ajouté dynamiquement:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Abdo
la source
37

Utilisez android:imeOptions="flagNoFullscreen"pour atteindre cette fonction.

ridoy
la source
1
belle et meilleure approche pour écrire en xml. Travaille pour moi. Merci
Ahesanali Suthar
1
Notez que dans la documentation de IME_FLAG_NO_EXTRACT_UI, qui correspond à flagNoExtractUi, il indique que «l'utilisation de cet indicateur est déconseillée et peut devenir obsolète à l'avenir», il en flagNoFullscreenest de même pour l'option recommandée.
ThomasW
12

De plus, si vous souhaitez combiner plusieurs imeOptions par programmation, vous pouvez utiliser le | syntaxe.

Par exemple, pour désactiver la vue d'édition en plein écran en paysage et remplacer la touche "Suivant" par "OK" (ACTION_DONE) dans le clavier, vous pouvez utiliser:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Maxime Ancelin
la source
9

Si vous modifiez directement l'IME, vous pouvez l'empêcher d'afficher jamais une vue extraite en remplaçant onUpdateExtractingVisibility:

@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
    ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
    super.onUpdateExtractingVisibility(ei);
}
ObsidianX
la source
6

Je sais qu'il est un peu tard, mais pour tous ceux qui sont toujours intéressés, voici ma solution: dans mon cas, j'avais une activité paysage contenant un EditText en haut et j'avais besoin d'implémenter la fonctionnalité de saisie semi-automatique dans cette activité de recherche , qui se chevauchait le clavier a causé un problème que l'utilisateur n'a pas pu voir le résultat de RecyclerView . J'ai donc fini par avoir cet EditText dans ma mise en page:

<EditText
  android:layout_width="match_parent"
  android:layout_height="?actionBarSize"
  android:id="@+id/main_search_et"
  android:imeOptions="actionSearch|flagNoExtractUi"
  android:inputType="text"  />

À votre santé!

Arefeh Iravanchi
la source
5

Ma solution:

android:imeOptions="flagNoExtractUi|flagNoFullscreen"
dastan
la source
Ceci est une réponse plus à jour.
alierdogan7
2

Vous pouvez utiliser :

android:imeOptions="flagNoFullscreen" 

dans votre edittext

Thientvse
la source
1
Est-ce une réponse?
artgb
Je l'essaye et ça marche pour moi! (Mon appareil est Android 4.1.2)
Thientvse
0

Vous pouvez appeler pour masquer le clavier virtuel et effacer la mise au point de la vue de recherche.

public void hideKeyboard(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

super.clearFocus();
mohamed elagamy
la source