15

アプリケーションがあり、かなり大量のアクションでソフトキーボードを閉じる必要があります。たとえば、ボタンをクリックしたとき、新しいレイアウトが描画されたとき、画面の向きが変わったとき、コントローラーがUI に指示したときなどです。optionsMenuButton を使用して、ViewFlipper でビューを反転します。明らかに、反転したビューでキーボードを非表示にする必要があります (入力フィールドはありません)。

これまでにこれらを試してみましたが、これらが信頼できない理由を教えてください。

多くの editTexts やその他のビューがあるため、これは機能しませんでした。可能であれば、引数としてビューを必要としない、より一般的なものが必要です。

InputMethodManager imm = (InputMethodManager)getSystemService(
  Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

これは私にとってはまったく機能しません:

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

これは機能しますが、ビューが反転するとすぐにキーボードが再びポップアップします。

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

これは時々機能しますが、ほとんどの場合、getCurrentFocus() は null を返します。

InputMethodManager inputManager = (InputMethodManager)            
Context.getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),      
InputMethodManager.HIDE_NOT_ALWAYS);

これは、キーボードが表示されている場合にのみ機能します。

getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

これは、最初のコードのように EditText では機能しませんが、方向の変更や oncreate が呼び出されるたびに変更されるルート レイアウトでは機能します。横/縦と通常/大で異なるレイアウト XML があります。すべてのルート レイアウトには ID がありますroot。これは最初はうまく機能しますが、その後は機能しなくなります。

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(findViewById(R.id.root).getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

結論: 私は非常に多くのソフトキーボード非表示方法を試しましたが、どれも確実に機能しないようです。ソフトキーボードを確実に隠す方法はありますか?

4

7 に答える 7

9

getCurrentFocus() の null ケースを処理できれば、問題ないと思います。以下の方法を使用すると、魅力的に機能します!

     /* Hide Keyboard */
    public static void hideKeyboard(Activity activity){
        InputMethodManager inputMethodManager = (InputMethodManager)activity
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        View focus = activity.getCurrentFocus();
        if(focus != null)
            inputMethodManager.hideSoftInputFromWindow(focus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
于 2012-10-23T14:38:00.893 に答える
8

キーボードを表示するには が必要なのでEditText、特定のキーボードを見つけて、表示された最初の方法を使用してキーボードを非表示にします。

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

ただし、それが必要になりますEditText。まず、すべてのビューを取得します。

public static ArrayList<View> getAllViewsFromRoots(View...roots) {
    ArrayList<View> result = new ArrayList<View>();
    for (View root : roots) {
        getAllViews(result, root);
    }
    return result;
}

private static void getAllViews(ArrayList<View> allviews, View parent) {
    allviews.add(parent);
    if (parent instanceof ViewGroup) {
        ViewGroup viewGroup = (ViewGroup)parent;
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            getAllViews(allviews, viewGroup.getChildAt(i));
        }
    }
}

次に、表示されている を取得しEditTextます。

public static EditText getEditText(View root) {
    ArrayList<View> views = getAllViewsFromRoots(root);
    for (View view : views) {
        if (view instanceof EditText && view.getVisibility() == View.VISIBLE) {
            return (EditText) view;
        }
    }
    return null;
}

どこかに電話してください:

Toolkit.getEditText(((ViewParent) findViewById(android.R.id.content)).getChildAt(0));

それで、非表示メソッドを呼び出します。

于 2013-01-27T07:25:46.337 に答える
4

これは常に私のために働きます:

InputMethodManager im = (InputMethodManager) getSystemService(MyActivity.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
于 2012-10-23T14:29:50.633 に答える
0

これは、ほとんどの場合に機能するはずです。

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(new View(this).getWindowToken(), 0);

ヌルポインタについても心配する必要はありません。

于 2014-10-22T06:41:43.340 に答える
0

この解決策だけが私のために働いた:

mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

入力フィールドのあるダイアログがあり、ダイアログを非表示にしてもタブレットのキーボードが非表示になりませんでした。

于 2014-03-24T17:21:16.867 に答える