255

重複の可能性:
Androidソフトキーボードをプログラムで閉じる/非表示にするにはどうすればよいですか?

まず最初に、私はすでにこのスレッドを見ました。私はそこで与えられた受け入れられた方法を試しましたが、何もうまくいきませんでした。

アプリに2つの画面があります。

  • 最初のものには2つのEditTextがあります-1つはユーザー名用、もう1つはパスワード用です
  • 2番目のものには1つのListViewとEditTextがあります-listViewをフィルタリングします

最初の画面では、ユーザー名EditTextで起動に焦点を合わせ、キーボードを表示する必要があります。これは私の実装です(不要な/無関係なコードを削除することで簡略化されています)。

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

さて、キーボードは起動時に表示されません。そして私のデザインはそこにキーボードをひどく必要とします。

次に2ページ目に進みます。すでに述べたように、そこにはlistViewとEditTextがあります。起動時にキーボードを非表示にして、ユーザーがeditTextに触れたときにのみ表示されるようにしたい。信じられますか?ソフトキーボードを試したものはすべて、アクティビティをロードしたときに表示されます。私はそれを隠すことができません。

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

単純化するには

  1. ログインページ(最初のページ)で起動時にキーボードが表示されるようにしたい。
  2. SecondPageでは、キーボードを最初に非表示にして、ユーザーがeditTextに触れたときにのみ表示されるようにします。

そして、私の問題は、両方の場合で正反対のものを取得していることです。誰かが以前にこの問題に直面したことを願っています。ところで、私はシミュレーターとHTCDesire電話でテストしています。

#FINAL OUTCOME

さて、ここにいるすべての友達の助けを借りて、私はそれを機能させました。

1.起動時にキーボードを表示するには

2つの答えが私のために働いた。@CapDroidによって提供されるもので、ハンドラーを使用して遅延して投稿します。

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

2番目の答えは@Dyarishによって提供されます。実際、彼は私が前に見たことがない別のSOFスレッドにリンクしていました。しかし、面白いことに、このソリューションは、最初に参照したスレッドで提供されています。そして、他のすべての投稿がたくさんの票を持っているスレッドで投票がゼロだったので、私はそれを試していません。愚かさの高さ。

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

私にとって、2番目の解決策はきれいに見えたので、私はそれに固執することにしました。しかし、最初の解決策は確かに機能します。また、@ Dynarishの回答には、EditTextの下にあるScrollViewを使用してEditTextにフォーカスを与えるという巧妙なハックが含まれています。しかし、私はそれを試していませんが、うまくいくはずです。しかし、きちんとしていません。

2.アクティビティ開始時にキーボードを非表示にするには

@Dyarishによって提供された1つの答えだけが私のために働きました。そして、解決策は、EditTextsを含むレイアウトにXMLでfocusableInTouchMode設定を使用することです。これはトリックをしました

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

とにかく、どちらの場合もDyarishの答えを使うことになります。だから私は彼に賞金を授与しています。私を助けようとした他のすべての友達に感謝します。

4

4 に答える 4

172

更新 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
    }

私は非常に一生懸命試して解決策を見つけました...新しいアクティビティが開始されるたびにキーボードが開けませんが、onResumeでRunnableを使用でき、正常に動作しているので、このコードを試して確認してください...

更新 1

この行をあなたのAppLogin.java

mUserNameEdit.requestFocus();

そしてあなたのこの行AppList.java

listview.requestFocus()'

この後、アプリケーションが機能していないかどうかを確認してから、この行をAndroidManifest.xmlファイルに追加します

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

元の答え

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

キーボードを隠す

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

ショーキーボード用

 imm.showSoftInput(ed, 0);

EditText にフォーカスするため

 ed.requestFocus();

ed は EditText です

于 2011-08-26T05:21:46.307 に答える
137

これをコードandroid:focusableInTouchMode="true"に追加すると、編集テキスト ボックスの起動時にキーパッドが表示されなくなります。この行を、EditTextBox を含む線形レイアウトに追加します。これで遊んで、両方の問題を解決できるはずです。私はこれをテストしました。シンプルなソリューション。

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

------------------編集: 起動時にキーボードを表示するには-----------------------

これは、起動時にユーザー名 edittextbox にキーボードが表示されるようにするためです。私が行ったのは、空の Scrollview を .xml ファイルの下部に追加したことだけです。これにより、最初の編集テキストがフォーカスされ、キーボードがポップアップします。これがハックであることは認めますが、これを機能させたいだけだと思います。私はそれをテストしました、そしてそれはうまくいきます。

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

より雄弁な解決策を探している場合は、この質問が役立つ可能性があります。上記の解決策ほど単純ではありませんが、おそらくより良い解決策です。私はそれをテストしていませんが、どうやらうまくいくようです。あなたが試した解決策に似ていると思いますが、うまくいきませんでした。

これがあなたが探しているものであることを願っています。

乾杯!

于 2011-09-01T00:32:38.477 に答える
56

このコードを試してください。

ソフトキーボードを表示する場合:

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

SoftKeyboardを非表示にする場合-

InputMethodManager imm = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }
于 2011-08-26T05:26:29.300 に答える
9

InputMethodManager.SHOW_IMPLICIT最初のウィンドウで試しましたか。

と2番目のウィンドウの使用に隠れるためにInputMethodManager.HIDE_IMPLICIT_ONLY

編集:

それでも機能しない場合は、おそらく間違った場所に置いています。オーバーライドonFinishInflate()して、そこで表示/非表示にします。

@override
public void onFinishInflate() {
     /* code to show keyboard on startup */
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);
}
于 2011-08-26T05:24:21.583 に答える