261 votes

Android - Masquage/affichage programmé du clavier logiciel

Duplicata possible :
Comment fermer/masquer le clavier programmable Android de manière programmatique ?

Tout d'abord, j'ai déjà vu este fil. J'ai essayé les méthodes acceptées qui y sont données, mais rien n'a fonctionné pour moi.

J'ai deux écrans dans mon application.

  • Le premier a 2 EditText - Un pour le nom d'utilisateur et un pour le mot de passe.
  • La seconde a une ListView, et un EditText - pour filtrer les données. listView

Dans mon premier écran, je veux que le nom d'utilisateur EditText ait le focus au démarrage et que le clavier soit visible. . Voici mon implémentation (simplifiée en supprimant le code inutile ou sans rapport).

app_login.xml

<LinearLayout android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dip"  
    android:paddingRight="20dip">

    <EditText android:id="@+id/username" 
        android:singleLine="true" 
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" android:hint="Username"  
        android:imeOptions="actionDone" android:inputType="text"
        android:maxLines="1"/>

    <EditText android:id="@+id/password" 
        android:password="true" 
        android:singleLine="true"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"    
        android:hint="Password" />
</LinearLayout>

AppLogin.java

class AppLogin extends Activity{
    private EditText mUserNameEdit = null;
    private EditText mPasswordEdit = null;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.app_login);

        mUserNameEdit  =    (EditText) findViewById(R.id.username);
        mPasswordEdit  =    (EditText) findViewById(R.id.password);

        /* code to show keyboard on startup.this code is not working.*/
        InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);

    }//End of onCreate()
}

Bien, le clavier ne s'affiche pas au démarrage . Et mon projet nécessite un clavier à cet endroit.

Passons maintenant à deuxième page . Comme je l'ai déjà mentionné, j'y ai une listView et un EditText. Je veux que mon clavier soit masqué au démarrage et qu'il apparaisse lorsque l'utilisateur touche le texte à modifier. . Pouvez-vous le croire ? Quoi que j'ai essayé Le clavier souple s'affiche lorsque je charge l'activité. . Je ne suis pas capable de le cacher.

app_list_view.xml

<LinearLayout android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" >

   <EditText android:id="@+id/filter_edittext"       
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Search" android:inputType="text" 
        android:maxLines="1"/>
    <ListView android:id="@id/android:list" 
        android:layout_height="fill_parent"
        android:layout_weight="1.0" 
        android:layout_width="fill_parent" 
        android:focusable="true" 
        android:descendantFocusability="beforeDescendants"/>
</LinearLayout>     

AppList.java

public class MyListActivity extends ListActivity{
   private EditText mfilterEditText;

    @Override
   public void onCreate(Bundle savedInstanceState) {        
      super.onCreate(savedInstanceState);
      setContentView(R.layout.app_list_view);

      mFilterEditText  =  (EditText) findViewById(R.id.filter_edittext);
      InputMethodManager imm = InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
      imm.hideSoftInputFromWindow(mFilterEditText.getWindowToken(), 0);
   }
}

Pour simplifier

  1. Sur la page de connexion (première page), je veux que mon clavier soit visible au démarrage.
  2. Sur la deuxième page, je veux que le clavier soit d'abord caché, puis qu'il apparaisse. lorsque l'utilisateur touche editText

Et mon problème est que j'obtiens l'exact opposé dans les deux cas. . J'espère que quelqu'un a déjà rencontré ce problème. BTW Je teste sur le simulateur et le téléphone HTC Desire.

RÉSULTAT FINAL

Eh bien, je l'ai fait fonctionner, avec l'aide de tous mes amis ici.

1. Pour afficher le clavier au démarrage

Deux réponses ont fonctionné pour moi. Celle fournie par @CapDroid, qui consiste à utiliser un gestionnaire et à le poster en différé

mUserNameEdit.postDelayed(new Runnable() {
  @Override
  public void run() {
    // TODO Auto-generated method stub
    InputMethodManager keyboard = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    keyboard.showSoftInput(mUserNameEdit, 0);
  }
},50);

La deuxième réponse est fournie par @Dyarish. En fait, il a fait un lien vers un autre fil de discussion sur les FOS, que je n'avais pas vu auparavant. Mais le plus drôle, c'est que cette solution est donnée dans le fil que j'ai référencé au début. Et je n'ai pas essayé Et je ne l'ai pas essayée parce qu'elle n'avait pas de votes dans un fil où tous les autres messages ont beaucoup de votes. Le comble de la bêtise.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

En ce qui me concerne, la deuxième solution m'a semblé correcte et j'ai décidé de m'y tenir, mais la première fonctionne certainement. De plus, la réponse de @Dyarish contient une astuce astucieuse consistant à utiliser un ScrollView sous EditText pour donner le focus à EditText. Je ne l'ai pas essayé, mais cela devrait fonctionner. Mais ce n'est pas très élégant.

2. Pour masquer le clavier au début de l'activité

Une seule réponse a fonctionné pour moi, celle fournie par @Dyarish. La solution est d'utiliser les paramètres focusableInTouchMode dans le XML pour la disposition contenant les EditTexts. Voici ce qui a fonctionné

<LinearLayout android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:focusableInTouchMode="true">
    <EditText android:id="@+id/filter_edittext"       
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Search" android:inputType="text" 
        android:maxLines="1"/>
    <ListView android:id="@id/android:list" 
        android:layout_height="fill_parent"
        android:layout_weight="1.0" 
        android:layout_width="fill_parent" 
        android:focusable="true" 
        android:descendantFocusability="beforeDescendants"/>
</LinearLayout> 

Quoi qu'il en soit, je finis par utiliser la réponse de Dyarish dans les deux cas. C'est donc à lui que j'attribue la prime. Merci à tous mes autres amis qui ont essayé de m'aider.

0 votes

@user7777777777 J'ai modifié ma question...mais cela ne fonctionne pas...J'ai essayé avec différents drapeaux au lieu de 0 aussi...

1 votes

Voir mon nouvelle version répondre, ça marche pour moi...

0 votes

La mise en page app_login.xml ne semble pas être le fichier de mise en page complet. Veuillez afficher la mise en page complète.

173voto

CapDroid Points 19038

MISE À JOUR 2

@Override
    protected void onResume() {
        super.onResume();
        mUserNameEdit.requestFocus();

        mUserNameEdit.postDelayed(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                InputMethodManager keyboard = (InputMethodManager)
                getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(mUserNameEdit, 0);
            }
        },200); //use 300 to make it run when coming back from lock screen
    }

J'ai essayé très fort et j'ai trouvé une solution ... chaque fois qu'une nouvelle activité démarre, le clavier ne peut pas s'ouvrir mais nous pouvons utiliser Runnable sur onResume et cela fonctionne bien, alors essayez ce code et vérifiez...

MISE À JOUR 1

ajoutez cette ligne dans votre AppLogin.java

mUserNameEdit.requestFocus();

et cette ligne dans votre AppList.java

listview.requestFocus()'

Après cela, vérifiez votre application, si elle ne fonctionne pas, ajoutez cette ligne dans votre application. AndroidManifest.xml fichier

<activity android:name=".AppLogin" android:configChanges="keyboardHidden|orientation"></activity>
<activity android:name=".AppList" android:configChanges="keyboard|orientation"></activity>

PREMIÈRE RÉPONSE

 InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);

pour cacher le clavier

 imm.hideSoftInputFromWindow(ed.getWindowToken(), 0); 

pour le clavier d'exposition

 imm.showSoftInput(ed, 0);

pour le focus sur l'EditText

 ed.requestFocus();

où ed est EditText

2 votes

@sHaH well C'est la même réponse que celle du fil de discussion que j'ai lié dans la question, n'est-ce pas ? La seule différence est que vous avez essayé Service.INPUT_METHOD_SERVICE au lieu de Context.INPUT_METHOD_SERVICE que j'ai essayé

0 votes

J'ai également essayé comme vous l'avez suggéré et ajouté requestFocus() mais sans succès En tout cas, merci pour la suggestion :)

0 votes

Voir ma réponse mise à jour...

138voto

Dave Points 1390

Ajoutez ceci à votre code android:focusableInTouchMode="true" fera en sorte que votre clavier n'apparaisse pas au démarrage de votre boîte d'édition. Vous devez ajouter cette ligne à votre layout linéaire qui contient l'EditTextBox. Vous devriez être en mesure de jouer avec cela pour résoudre vos deux problèmes. Je l'ai testé. Solution simple.

ie : Dans votre fichier app_list_view.xml

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:focusableInTouchMode="true">
    <EditText 
        android:id="@+id/filter_edittext"       
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Search" 
        android:inputType="text" 
        android:maxLines="1"/>
    <ListView 
        android:id="@id/android:list" 
        android:layout_height="fill_parent"
        android:layout_weight="1.0" 
        android:layout_width="fill_parent" 
        android:focusable="true" 
        android:descendantFocusability="beforeDescendants"/>
</LinearLayout> 

------------------ EDIT : Pour faire apparaître le clavier au démarrage -----------------------

Cela permet de faire apparaître le clavier dans la boîte de texte du nom d'utilisateur au démarrage. Tout ce que j'ai fait est d'ajouter un Scrollview vide au bas du fichier .xml, ce qui met le premier edittext en focus et fait apparaître le clavier. J'admets que c'est un hack, mais je suppose que vous voulez simplement que cela fonctionne. Je l'ai testé, et cela fonctionne bien.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dip"  
    android:paddingRight="20dip">
    <EditText 
        android:id="@+id/userName" 
        android:singleLine="true" 
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" 
        android:hint="Username"  
        android:imeOptions="actionDone" 
        android:inputType="text"
        android:maxLines="1"
       />
    <EditText 
        android:id="@+id/password" 
        android:password="true" 
        android:singleLine="true"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Password" />
    <ScrollView
        android:id="@+id/ScrollView01"  
        android:layout_height="fill_parent"   
        android:layout_width="fill_parent"> 
    </ScrollView>
</LinearLayout>

Si vous cherchez une solution plus éloquente, j'ai trouvé este Ce n'est pas aussi simple que la solution ci-dessus, mais c'est probablement une meilleure solution. Je ne l'ai pas testée mais elle semble fonctionner. Je pense qu'elle est similaire à la solution que vous avez essayée et qui n'a pas fonctionné pour vous.

J'espère que c'est ce que vous recherchez.

A la vôtre !

0 votes

Eh bien Dyarish, vos solutions cachent certainement le clavier. Maintenant, laissez-moi jouer avec ceci pour afficher le clavier au démarrage.

0 votes

Hé Krishnabhadra, j'ai deux solutions potentielles qui devraient fonctionner. La première est une sorte de hack, mais je l'ai testée avec votre code et cela fonctionne. (J'admets que je ne sais pas pourquoi, mais c'est probablement dû aux propriétés de cette vue) J'ai modifié ma réponse pour refléter ces solutions. Faites-moi savoir si cela fonctionne pour vous. Merci.

0 votes

Curieusement, seul le ScrollView a fonctionné, j'ai essayé les autres solutions "plus éloquentes" et elles n'ont pas fonctionné.

58voto

Prabuddha Points 37089

Essayez ce code.

Pour afficher le clavier logiciel :

InputMethodManager imm = (InputMethodManager)
                                 getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    }

Pour masquer le clavier logiciel -

InputMethodManager imm = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }

1 votes

Êtes-vous sûr que les arguments de toggleSoftInput pour afficher le clavier sont corrects ?

1 votes

J'ai demandé parce que la documentation de toggleSoftInput dit que le premier argument est un drapeau pour montrer et le second argument est un drapeau pour cacher Vous avez donné InputMethodManger.SHOW_IMPLICIT comme second argument C'est pourquoi j'ai demandé ?

1 votes

Quoi qu'il en soit, j'ai essayé les deux méthodes rien n'a fonctionné

9voto

userSeven7s Points 14480

Avez-vous essayé InputMethodManager.SHOW_IMPLICIT dans la première fenêtre.

et pour se cacher dans la deuxième fenêtre, utilisez InputMethodManager.HIDE_IMPLICIT_ONLY

EDIT :

Si cela ne fonctionne toujours pas, vous le placez probablement au mauvais endroit. Remplacer onFinishInflate() et l'afficher/cacher à cet endroit.

@override
public void onFinishInflate() {
     /* code to show keyboard on startup */
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);
}

0 votes

Oui ami J'ai essayé avec InputMethodManager.SHOW_FORCED, InputMethodManager.SHOW_IMPLICIT etc Aussi j'ai juste passé 0 au lieu de ces constantes aussi Rien n'a marché .

0 votes

J'ai essayé votre première modification (showSoftInputFromInputMethod) qui n'a pas fonctionné..BTW comment utiliser la deuxième méthode(showSoftInput) ?

0 votes

onFinishInflate() de la classe d'activité.. Je ne trouve pas cela dans la documentation En fait, onFinishInflate est une méthode de la classe View Comment puis-je l'utiliser ici ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X