我有一个应用程序,需要关闭相当多的操作上的软键盘。例如,当点击按钮时,当绘制新的布局时,屏幕方向更改时,控制器告诉>强大的> 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:我尝试了许多软键盘隐藏方法,但它们似乎都不可靠。 是否有任何方法可靠地隐藏软键盘?
答案 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);
也不用担心空指针。