Forcing the Soft Keyboard open
我试图在一个Activity中强制打开Soft Keyboard并抓取输入的所有内容,因为我想自己处理输入,我没有EditText。 目前我已经尝试了这个,但它不起作用。 我想在mAnswerTextView下打开Soft Keyboardto(注意:它是TextView而不是EditText)。
1 2 3 | 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 | ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); |
然后你可以使用这段代码来关闭键盘:
1 | ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(_pay_box_helper.getWindowToken(), 0); |
您可能需要具有某种可编辑的文本区域才能获得焦点。但是,您可能有一个不可见或透明背景,没有光标。您可能需要使用视图的可聚焦设置。
使用TextWatcher检查是否使用addTextChangedListener对EditText进行编辑,或者如果需要偶数较低级别的钩子,请使用setOnKeyListener()方法设置textview的键侦听器。请参阅KeyListener文档。
使用此调用强制打开软键盘:
1 2 | ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) .showSoftInput(myEditText, InputMethodManager.SHOW_FORCED); |
这个关闭它:
1 2 | ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(myEditText.getWindowToken(), 0); |
请注意,这是不推荐的 - 强制打开键盘有点乱。您的用例是什么,真正需要您在没有正常编辑框的情况下接受用户输入,并且需要逐个键地输入用户输入而不回复它?
强制键盘打开我使用过
1 | this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); |
它对我有用。
有时其他答案不起作用。
这是另一种方式..
它将通过监听窗口焦点强制键盘显示活动开始的时间。
1 2 3 4 5 6 7 8 9 10 | @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()); } } |
你可能还需要
1 2 3 4 5 6 7 8 9 | 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); } } }); |
编辑:我也看到键盘未在嵌套片段中打开,请注意这些情况。
可悲的是,尽管我喜欢对其中一个回复进行投票,但没有一个对我有用。似乎解决方案是等待布局阶段完成。在下面的代码中,请注意我如何检查
您需要在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | @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; } |
如果要控制内部活动的软键盘,请使用以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | //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(); |
您可以使用此KeyboardHelper.java类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import android.content.Context; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; /** * Created by khanhamza on 06-Mar-17. */ public class KeyboardHelper { public static void hideSoftKeyboard(Context context, View view) { if (context == null || view == null) { return; } InputMethodManager imm = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } public static void hideSoftKeyboardForced(Context context, View view) { if (context == null) { return; } InputMethodManager imm = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromInputMethod(view.getWindowToken(), 0); } public static void hideSoftKeyboard(Context context, EditText editText) { if (context == null) { return; } InputMethodManager imm = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY); } public static void showSoftKeyboard(Context context, EditText editText) { if (context == null) { return; } InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); editText.requestFocus(); } public static void showSoftKeyboardForcefully(Context context, EditText editText) { if (context == null) { return; } InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); editText.requestFocus(); } } |
For
kotlin user
完全归功于德米特里的回答
在Fragment中打开KeyBoard。
我按照我的要求将
但是我们走了......
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @SuppressLint("ValidFragment") class MyDemoFragment(private val mainActivity: MainActivity) : Fragment() { // EditText declaration private lateinit var etMyEditText: EditText override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { val view = inflater.inflate(R.layout.fragment_my_demo, container, false) // EditText initialisation etMyEditText = view.findViewById(R.id.etMyEditText) // This line will open KeyBoard (mainActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY) // Requesting cursor focus etMyEditText.requestFocus() return view } } |
简单地说,使用添加2行就像魅力一样:
如果使用XML
1 2 | android:focusable="true" android:focusableInTouchMode="true" |
其他Java:
1 2 | view.setFocusableInTouchMode(true); view.requestFocus(); |
工作得很好.........
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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); } }); } } }); |
当您要打开键盘时,在线下调用
1 | edt_searchfilter_searchtext.requestFocus(); |
我已经测试过,这是有效的:
...
//显示软键盘
1 | imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); |
//隐藏它,再次调用该方法
1 | imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); |
1 2 3 4 5 | if(search.getText().toString().trim().isEmpty()) { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(search.getWindowToken(), 0); } |