web-dev-qa-db-fra.com

Masquer / afficher par programme Android clavier virtuel

Duplicate possible:
Fermer/cacher le Android clavier virtuel

La première chose que j'ai vue en premier this thread. J'ai essayé les méthodes acceptées données ici..Mais rien ne fonctionnait pour moi ..

J'ai deux écrans dans mon application.

  • Le premier a 2 EditText's - un pour le nom d'utilisateur et un pour le mot de passe
  • Le second a un ListView et un EditText - pour filtrer le listView

Dans mon premier écran, je souhaite que le nom d'utilisateur EditText soit activé au démarrage et que le clavier soit visible .. Ceci est mon implémentation (simplifiée en supprimant les éléments inutiles/sans rapport codes)..

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()
}

Eh bien, le clavier ne s'affiche pas au démarrage . Et ma conception nécessite un clavier là-bas.

Passons maintenant à deuxième page .. J'ai déjà dit que j'ai une liste de vues et EditText ici .. Je veux mon clavier pour être caché au démarrage seulement pour apparaître lorsque l'utilisateur touche le editText .. Pouvez-vous le croire? peu importe ce que j'ai essayé , le clavier virtuel s'affiche lorsque je charge l'activité .. Je ne parviens pas à la masquer.

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 souhaite que mon clavier soit visible au démarrage.
  2. Sur SecondPage, je souhaite que le clavier soit d'abord masqué, puis qu'il n'apparaisse que lorsque l'utilisateur touche editText

Et mon problème est que je reçois exactement le contraire à la fois ... J'espère que quelqu'un a déjà fait face à ce problème.BTW Je teste sur simulateur et téléphone HTC Desire .

RÉSULTAT FINAL

Eh bien, je le fais fonctionner, avec l'aide de tous les amis ici.

1. Pour afficher le clavier au démarrage

Deux réponses ont fonctionné pour moi. Celui fourni 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);

Les secondes réponses sont fournies par @Dyarish. En fait, il est lié à un autre thread SO, que je n'ai jamais vu auparavant. Mais ce qui est amusant, c’est que cette solution est donnée dans le fil que j’ai référencé au début. Et je ne l'ai pas essayé parce qu'il n'y avait pas de voix dans un fil de discussion où tous les autres posts ont beaucoup de voix .. Hauteurs de la folie ..

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

Pour moi, la deuxième solution avait l'air chouette, alors j'ai décidé de m'en tenir à cela..Mais la première fonctionne certainement. En outre, la réponse de @ Dyarish contient une astuce astucieuse consistant à utiliser un objet ScrollView sous EditText pour donner le focus à EditText .. Mais je ne l'ai pas essayé, mais cela devrait fonctionner. Pas chouette ..

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

Une seule réponse a fonctionné pour moi, fournie par @Dyarish. Et la solution consiste à utiliser les paramètres de focusableInTouchMode dans XML pour la mise en page contenant les editText. Cela a fait le tour

<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. Je lui attribue donc cette prime. Merci à tous les autres amis qui ont essayé de m'aider.

230
Krishnabhadra

En ajoutant ceci à votre code, Android:focusableInTouchMode="true" s'assurera que votre clavier n'apparaît pas au démarrage pour votre boîte de dialogue edittext. Vous voulez ajouter cette ligne à votre disposition linéaire qui contient EditTextBox. Vous devriez pouvoir jouer avec cela pour résoudre vos deux problèmes. J'ai testé cela. Solution simple.

par exemple, 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 que le clavier apparaisse au démarrage ------ -----------------

Ceci est fait pour que le clavier apparaisse sur le nom d'utilisateur edittextbox au démarrage. Tout ce que j'ai fait est ajouté une Scrollview vide au bas du fichier .xml, cela met en évidence le premier edittext et fait apparaître le clavier. J'admets que c'est un bidouillage, mais je suppose que vous voulez juste que cela fonctionne. Je l'ai testé et ça 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é this question qui pourrait vous aider, ce n'est pas aussi simple que la solution ci-dessus, mais probablement une meilleure solution. Je ne l'ai pas testé mais cela fonctionne apparemment. Je pense que cela ressemble à 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.

À votre santé!

130
Dave

PDATE 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é commence, le clavier ne peut pas s'ouvrir mais nous pouvons utiliser Runnable in onResume et tout fonctionne correctement. Veuillez essayer ce code et vérifier ...

PDATE 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, puis ajoutez cette ligne dans votre fichier AndroidManifest.xml.

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

REPONSE ORIGINALE

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

pour cacher le clavier

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

pour afficher le clavier

 imm.showSoftInput(ed, 0);

pour se concentrer sur EditText

 ed.requestFocus();

où ed est EditText

159
Niranj Patel

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 SoftKeyboard -

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

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, alors vous le mettez probablement au mauvais endroit. Remplacez onFinishInflate() et affichez/cachez-y.

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