关于android:强制打开软键盘

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);

    它对我有用。


    有时其他答案不起作用。
    这是另一种方式..

    它将通过监听窗口焦点强制键盘显示活动开始的时间。 onWindowFocusChanged()它?宄⑶肭驟ditText的焦点,然后将软输入模式设置为可见,并将选择设置为框中的文本。如果您从活动中调用它,这应始终有效。

    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);
                }
            }
        });

    编辑:我也看到键盘未在嵌套片段中打开,请注意这些情况。


    可悲的是,尽管我喜欢对其中一个回复进行投票,但没有一个对我有用。似乎解决方案是等待布局阶段完成。在下面的代码中,请注意我如何检查showKeyboard方法是否返回TRUE,以及当我删除全局布局侦听器时。没有做到这一点,它被击中和错过。现在看起来效果很好。

    您需要在onResume()中理想地执行以下操作

    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。

    我按照我的要求将mainActivity变量传递给了fragment constructor,也许这个黑客/补丁不建议按照AndroidGuidLines(我不知道)。

    但是我们走了......

    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);
    }