web-dev-qa-db-ja.com

プログラム的にAndroidのソフトキーボードを隠す/表示する

重複の可能性:
Androidソフトキーボードを閉じる/隠す

まず最初に this threadを見ました。私はそこに与えられた受け入れられた方法を試みました。しかし何も私のために働きませんでした..

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

  • 最初のものには2つのEditTextがあります - ユーザー名用とパスワード用の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をタッチしたときにだけ表示されるようにします。

そして、私の問題は、私が両方の機会に正反対になっていることです...誰かがこの問題に以前直面していたことを願っています。

最終結果

まあ、私はそれをすべての友達の助けを借りて、ここでうまくいった。

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

二つの答えが私のために働いた。 1つは@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によって提供されています。実際、彼は別のSOスレッドにリンクしていましたが、私はこれまで見たことがありませんでした。しかし面白いことに、この解決策は最初に参照したスレッドで与えられています。そして、私はそれを試したことがありません。なぜなら、他のすべての投稿にたくさんの投票があるスレッドで投票がゼロだったからです。愚かさの高さ..

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

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

2.活動開始時にキーボードを隠すには

1つの答えだけが私のために働きました。それは@Dyarishによって提供されます。そして解決策は、editTextを含むレイアウトに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の答えを使用することになります。だから私は彼に賞金を授与しています。私を助けようとした他のすべての友人に感謝します。

228
Krishnabhadra

これをコード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にキーボードを表示させるためです。 .xmlファイルの最後に空のScrollviewを追加するだけで、最初の編集テキストにフォーカスが置かれ、キーボードがポップアップします。私はこれがハックであることを認めます、しかし私はあなたがこれを機能させたいだけであると思います。私はそれをテストしました、そしてそれはうまく働きます。

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

あなたがもっと雄弁な解決策を探しているなら、私はあなたを助けるかもしれない この の質問を見つけました、それは上の解決策ほど単純ではありませんがおそらくより良い解決策です。私はそれをテストしていませんが、どうやらうまくいきます。私はそれがあなたのためにうまくいかなかったあなたが試した解決策に似ていると思う。

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

乾杯!

130
Dave

アップデート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
    }

私は一生懸命に努力して解決策を見つけました...新しい活動が始まるときはいつでもキーボード傾けて開くことができますが、我々はonResumeRunnableとそれを使うことができます正常に動作しているので、このコードを試してみてください...

アップデート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です。

157
Niranj Patel

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

ソフトキーボードを表示するには:

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);
    }
53
Lalit Poptani

最初のウィンドウで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);
}
8
Ronnie