我正在尝试创建一个包含EditTexts的RecyclerView的DialogFragment。它会滚动,当我单击EditText时会出现复制/剪切/粘贴,但键盘永远不会出现。适配器工作,因为我尝试在Activity中实现RecyclerView。
我已经尝试找到使键盘显示的解决方案,例如在XML中添加它
</request focus>
或此对话框
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
但仍然无效。
非常感谢你。
附加:此处显示当前的显示方式
答案 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 documentation,AlertDialog
会根据对话框中的任何视图是否从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>