强制打开软键盘

我试图强制软键盘在一个活动中打开,抓住一切input,因为我想自己处理input,我没有一个EditText。 目前我已经尝试过,但它不工作。 我想软键盘打开下面mAnswerTextView(注意:这是一个TextView不EditText)。

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // only will trigger it if no physical keyboard is open mgr.showSoftInput(mAnswerTextView, InputMethodManager.SHOW_IMPLICIT); 
  1. 如何强制打开软键盘
  2. 如何收集所有input的信息,以便我能处理每个字符。 我想处理它后,从软键盘刷新每个字符。 即,用户不应该能够在软键盘中input整个单词。

试试这个强制打开软键盘:

 ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 

那么你可以使用这段代码来closures键盘:

 ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(_pay_box_helper.getWindowToken(), 0); 

你可能需要有一个可编辑的文本区域的某种焦点。 不过你可能有一个不可见的透明背景。 您可能需要玩弄视图的可聚焦性设置。

使用TextWatcher通过addTextChangedListener检查EditText的编辑,或者如果您需要更低级别的钩子,请使用setOnKeyListener()方法设置textview的关键侦听器。 请参阅KeyListener文档 。

使用此调用强制打开软键盘:

 ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) .showSoftInput(myEditText, InputMethodManager.SHOW_FORCED); 

这一个closures它:

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

请注意,这是真的不build议 – 强制打开键盘是一种凌乱。 你真正需要什么样的用例才能让用户在没有正常编辑框的情况下进行input,并且需要在逐个键的基础上进行用户input而不需要回显?

强制键盘打开我使用

 this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); 

它为我工作。

有时其他答案将无法正常工作。
这是另一种方式..

它将通过监听窗口焦点强制键盘显示活动何时开始。 onWindowFocusChanged()将清除并请求EditText的焦点,然后将软input模式设置为可见,并将select设置为框中的文本。 这应该总是工作,如果你从活动调用它。

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { mEditText.clearFocus(); mEditText.requestFocus(); getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); mEditText.setSelection(mEditText.getText().toString().length()); } } 

你可能也需要

 mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT); } } }); 

编辑:我也看到了键盘没有打开嵌套的片段,提防这些情况。

如果你想控制活动内的软键盘,那么使用下面的代码:

 //create soft keyboard object InputMethodManager imm = (InputMethodManager)this.getSystemService(INPUT_METHOD_SERVICE); //1.USE your_view.setFocusableInTouchMode(true); //Enable touch soft keyboard to this view //or your_view.setFocusable(true); //Enable keyboard to this view imm.showInputMethod(your_view, InputMethodManager.SHOW_IMPLICIT); //2.USE show keyboard if is hidden or hide if it is shown imm.toggleSoftInputFromWindow(your_view.getWindowToken(),InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY); //or imm.toggleSoftInputFromWindow(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY); //3.USE (you cannot control imm) this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); //4.USE (with Dialog) Dialog d = new Dialog(this, android.R.style.Theme_Panel); d.getWindow().setTitle(null); d.setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); d.setOnKeyListener(keyListener); d.setCanceledOnTouchOutside(true); d.setCancelable(true); d.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); d.show(); //to hide keyboard call: d.dismiss(); //if you want get soft keyboard visibility call: d.isShowing(); 

可悲的是,尽pipe我喜欢对其中一个答复进行投票,但是没有人为我工作。 看来解决scheme是等待布局阶段完成。 在下面的代码中,请注意我如何检查showKeyboard方法是否返回TRUE,这是我删除全局布局侦听器。 没有这样做,它被打了一个漏。 现在它似乎完美的工作。

您需要在onResume()

 @Override public void onResume() { super.onResume(); ViewTreeObserver vto = txtTaskTitle.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (txtTaskTitle.requestFocus()) { if (showKeyboard(getContext(), txtTaskTitle)) { txtTaskTitle.getViewTreeObserver().removeOnGlobalLayoutListener(this); } } } }); } public static boolean showKeyboard(Context context, EditText target) { if (context == null || target == null) { return false; } InputMethodManager imm = getInputMethodManager(context); ((InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(target, InputMethodManager.SHOW_FORCED); boolean didShowKeyboard = imm.showSoftInput(target, InputMethodManager.SHOW_FORCED); if (!didShowKeyboard) { didShowKeyboard = ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(target, InputMethodManager.SHOW_FORCED); } return didShowKeyboard; } 
 if(search.getText().toString().trim().isEmpty()) { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(search.getWindowToken(), 0); } 

努力工作………

 edt_searchfilter_searchtext.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){ edt_searchfilter_searchtext.post(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) getFragmentActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(edt_searchfilter_searchtext, InputMethodManager.SHOW_IMPLICIT); } }); } } }); 

当你想要打开键盘时,请在下方拨打电话

  edt_searchfilter_searchtext.requestFocus(); 

简单地说,使用添加2行就像一个魅力:

如果使用XML

 android:focusable="true" android:focusableInTouchMode="true" 

其他在Java:

 view.setFocusableInTouchMode(true); view.requestFocus(); 

我已经testing,这是工作:

… //显示软键盘

 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 

//隐藏它,再次调用该方法

 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);