可靠地隐藏软键盘

时间:2012-10-23 14:12:32

标签: java android android-softkeyboard

我有一个应用程序,需要关闭相当多的操作上的软键盘。例如,当点击按钮时,当绘制新的布局时,屏幕方向更改时,控制器告诉强大的> 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);

Bottomline:我尝试了许多软键盘隐藏方法,但它们似乎都不可靠。 是否有任何方法可靠地隐藏软键盘?

6 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:6)

由于您需要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));

用它来调用隐藏方法。

答案 2 :(得分:4)

这个一直对我有用:

InputMethodManager im = (InputMethodManager) getSystemService(MyActivity.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

答案 3 :(得分:1)

科特林。把它放在常见的 BaseActivity 上。只需在您的活动中的任何地方调用 hideKeyboard() 方法,类似于申请 Fragment。

open class BaseActivity : AppCompatActivity() {

fun Fragment.hideKeyboard() {
    view?.let { activity?.hideKeyboard(it) }
}

fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

}

答案 4 :(得分:0)

只有这个解决方案对我有用:

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

我有一个带输入字段的对话框,隐藏对话框并没有将键盘隐藏在平板电脑上。

答案 5 :(得分:0)

这适用于大多数情况。

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

也不用担心空指针。