软键盘不会出现在DialogFragment中的EditText RecyclerView上

时间:2016-04-09 02:48:36

标签: android android-edittext android-recyclerview android-softkeyboard

我正在尝试创建一个包含EditTexts的RecyclerView的DialogFragment。它会滚动,当我单击EditText时会出现复制/剪切/粘贴,但键盘永远不会出现。适配器工作,因为我尝试在Activity中实现RecyclerView。

我已经尝试找到使键盘显示的解决方案,例如在XML中添加它

</request focus>

或此对话框

dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

但仍然无效。

非常感谢你。

附加:此处显示当前的显示方式

enter image description here

6 个答案:

答案 0 :(得分:4)

a)强制打开输入法。

InputMethodManager inputMananger = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputMananger.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

b)请求您关注的EditText焦点。

editText.requestFocusFromTouch();

答案 1 :(得分:3)

我知道这个问题是在一年前问过的,但我今天也问了同样的问题,所以看来这个问题仍然令人困惑......

无论如何,我遇到了多个&#34;解决方案&#34;浏览Stack Overflow和Android API参考后,但只有一个可以工作。现在我不确定为什么这些看似很好的解决方案对我来说不起作用。但至少我认为我理解(​​或者我有一个理论)为什么终于有效的解决方案。

请注意!如果您使用其他方式在onCreateDialog(Bundle)中创建对话框,而不是使用AlertDialog及其AlertDialog.Builder,则此解决方案可能无效。

Here is the solution that worked for me.

按照上面的解决方案建议,你是&#34;欺骗&#34; AlertDialog为你设置正确的标志。我并不是说它的代码实践不好,但它可能不是理想的代码实践。对于那些不仅寻求快速解决方案而且准备深入研究此事的人,请继续阅读:

因此,根据AlertDialog's documentationAlertDialog会根据对话框中的任何视图是否从View.onCheckIsTextEditor()返回true来自动设置一些窗口放置相关的标记。 AlertLayout的这种行为由this solution提出,这似乎帮助了很多人提出同样的问题,但没有RecyclerView参与,只涉及AlertDialog,而不是AlertDialog子类使用DialogFragment

您可能会让后一个解决方案正常工作(查看其最常投票的评论),但您的DialogFragment子类必须提供一种方式,在显示DialogFragment之后获取AlertDialog的窗口,以便您可以修改其标志。我没有试过这个,因为DialogFragment没有提供这种功能。

答案 2 :(得分:1)

在为扩展RecyclerView.Adapter的类创建的view中使用DialogFragment时,我遇到了同样的问题。另外,在我的ViewHolder中,我使用的EditText在聚焦时没有显示键盘。

@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
    View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_text_detected_list, null);
    //{...setAdapter, and other setups...}
    AlertDialog dialog = builder.setView(view).create();

    //The below line, solves my problem with the keyboard not showing up
    dialog.setOnShowListener(d -> dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM));
    return dialog;
}

答案 3 :(得分:0)

尝试使用:

InputMethodManager imm1 = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        edt_user_name.postDelayed(new Runnable()
        {
            @Override
            public void run()
            {
                edt_user_name.requestFocus();
                imm1.showSoftInput(edt_user_name, 0);
            }
        }, 100);

对于特定的EditText,例如edt_user_name

答案 4 :(得分:0)

这对我有用:

public AlertDialog onCreateDialog(Bundle savedInstanceState) {
    super.onCreateDialog(savedInstanceState);

    // ...
    alertDialog.show();

    // This line is the key
    alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

    return alertDialog;
}

答案 5 :(得分:0)

对于我来说,我已经通过在片段布局(不只是RecyclerView)中添加EditText来解决了这个问题,

<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <EditText
            android:id="@+id/editFake"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:visibility="gone"
            android:importantForAutofill="no"
            android:hint="@string/empty"
            android:inputType="none"
            tools:targetApi="o"
            android:background="@null"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

    <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
    />
</android.support.constraint.ConstraintLayout>