webentwicklung-frage-antwort-db.com.de

Programmatisch ausblenden / einblenden Android Softtastatur

Mögliches Duplikat:
Schließen/Verbergen der Android Soft Keyboard

Das erste, was ich gesehen habe, war this thread. Ich habe dort akzeptierte Methoden ausprobiert. Aber nichts hat bei mir funktioniert.

Ich habe zwei Bildschirme in meiner App.

  • Zuerst hat man 2 EditText's - einen für den Benutzernamen und einen für das Passwort
  • Zweitens haben Sie eine ListView und einen EditText - um die ListView zu filtern

In meinem ersten Bildschirm möchte ich, dass der Benutzername EditText den Fokus auf den Start legt und die Tastatur sichtbar ist . Dies ist meine Implementierung (vereinfacht durch Entfernen unnötiger/nicht verwandter Elemente 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()
}

Nun, die Tastatur wird beim Start nicht angezeigt . Und mein Design erfordert dort dringend eine Tastatur.

Nun zu zweiter Seite . Ich habe bereits gesagt, dass ich eine ListView und EditText dort habe. Ich möchte meine Tastatur beim Start nur ausgeblendet werden, um angezeigt zu werden, wenn der Benutzer den editText berührt. Können Sie es glauben? Was auch immer ich versucht habe , wird angezeigt, wenn ich die Aktivität lade . Ich kann sie nicht ausblenden.

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

Vereinfachen

  1. Auf der Anmeldeseite (erste Seite) soll meine Tastatur beim Start sichtbar sein.
  2. In SecondPage soll die Tastatur zuerst ausgeblendet werden und nur angezeigt werden, wenn der Benutzer editText berührt

Und mein Problem ist, dass ich bei beiden Gelegenheiten genau das Gegenteil erhalte .

ENDERGEBNIS

Nun, ich habe es geschafft, mit der Hilfe aller Freunde hier.

1. So zeigen Sie die Tastatur beim Start an

Zwei Antworten haben für mich funktioniert. Eine von @CapDroid bereitgestellte Methode, die einen Handler verwendet und diesen verzögert bereitstellt.

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);

Die zweiten Antworten liefert @Dyarish. Tatsächlich hat er auf einen anderen SO Thread verlinkt, den ich noch nicht gesehen habe. Aber das Komische ist, dass diese Lösung in dem Thread angegeben ist, den ich erstellt habe Ich habe es nicht ausprobiert, weil es in einem Thread keine Stimmen hatte, in dem alle anderen Beiträge viele Stimmen haben.

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

Für mich sah die zweite Lösung ordentlich aus, also habe ich beschlossen, dabei zu bleiben. Aber die erste funktioniert auf jeden Fall. @ Dyarishs Antwort enthält auch einen cleveren Hack, wie man eine ScrollView unterhalb von EditText verwendet, um EditText den Fokus zu geben. Aber ich habe es nicht ausprobiert, aber es sollte funktionieren. Nicht ordentlich aber ..

2. Tastatur beim Start der Aktivität ausblenden

Bei mir hat nur eine Antwort geklappt, die von @Dyarish zur Verfügung gestellt wird. Die Lösung besteht darin, die focusableInTouchMode-Einstellungen in XML für das Layout zu verwenden, das die editText-Elemente enthält. Das hat den Trick gemacht

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

Wie auch immer, ich werde in beiden Fällen Dyarishs Antwort verwenden. Also gebe ich ihm das Kopfgeld. Danke an alle anderen Freunde, die versucht haben, mir zu helfen.

230
Krishnabhadra

Hinzufügen dieses zu Ihrem Code Android:focusableInTouchMode="true" stellt sicher, dass Ihre Tastatur beim Start für Ihre Edittext-Box nicht angezeigt wird. Sie möchten diese Zeile zu Ihrem linearen Layout hinzufügen, das die EditTextBox enthält. Sie sollten in der Lage sein, damit zu spielen, um beide Probleme zu lösen. Ich habe das getestet. Einfache lösung.

dh: In Ihrer app_list_view.xml-Datei

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

------------------ BEARBEITEN: Tastatur wird beim Start angezeigt ------ -----------------

Dies bewirkt, dass die Tastatur beim Start im Benutzernamen edittextbox angezeigt wird. Alles, was ich getan habe, ist ein leeres Scrollview am Ende der .xml-Datei. Dadurch wird der erste Edittext in den Fokus gerückt und die Tastatur wird eingeblendet. Ich gebe zu, dass dies ein Hack ist, aber ich gehe davon aus, dass Sie nur wollen, dass dies funktioniert. Ich habe es getestet und es funktioniert gut.

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

Wenn Sie nach einer beredteren Lösung suchen, habe ich this eine Frage gefunden, die Ihnen vielleicht weiterhelfen könnte. Sie ist nicht so einfach wie die oben stehende Lösung, aber wahrscheinlich eine bessere Lösung. Ich habe es nicht getestet, aber es funktioniert anscheinend. Ich denke, es ähnelt der Lösung, die Sie ausprobiert haben und die bei Ihnen jedoch nicht funktioniert hat.

Hoffe, das ist, was Sie suchen.

Prost!

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
    }

Ich habe mich sehr bemüht und eine Lösung gefunden ... wenn eine neue Aktivität beginnt, kann die Tastatur nicht geöffnet werden, aber wir können Runnable in onResume verwenden und es funktioniert einwandfrei. Bitte versuchen Sie es diesen Code und überprüfen ...

PDATE 1

füge diese Zeile in dein AppLogin.Java

mUserNameEdit.requestFocus();

und diese Zeile in Ihrem AppList.Java

listview.requestFocus()'

danach überprüfe deine Anwendung, wenn es nicht funktioniert, dann füge diese Zeile in dein AndroidManifest.xml Datei

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

RSPRÜNGLICHE ANTWORT

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

für Tastatur ausblenden

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

für Showtastatur

 imm.showSoftInput(ed, 0);

für den Fokus auf EditText

 ed.requestFocus();

dabei steht ed für EditText

159
Niranj Patel

Versuchen Sie diesen Code.

Zum Anzeigen von Softkeyboard:

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

Zum Ausblenden von SoftKeyboard -

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

Haben Sie im ersten Fenster InputMethodManager.SHOW_IMPLICIT Ausprobiert?.

und zum Verstecken im zweiten Fenster benutzen Sie InputMethodManager.HIDE_IMPLICIT_ONLY

EDIT:

Wenn es immer noch nicht funktioniert, platzieren Sie es wahrscheinlich am falschen Ort. onFinishInflate() überschreiben und dort ein-/ausblenden.

@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