AlertDialog中ListView内EditText点击不弹出软键盘问题求助
解决AlertDialog内嵌ListView中EditText无法唤起软键盘的问题
我明白你碰到的这个麻烦了——在AlertDialog的ListView列表项里的EditText点击后软键盘弹不出来,这其实是AlertDialog默认的窗口属性在搞鬼,下面给你几个实用的解决方案:
方案1:清除AlertDialog的窗口焦点限制标志
AlertDialog默认会设置FLAG_ALT_FOCUSABLE_IM这个标志,它会阻止EditText获取输入焦点并弹出软键盘。你只需要在dialog.show()之前清除这个标志,同时可以按需设置软键盘的显示模式:
修改你的show_dialog方法,在dialog = con_mBuilder.create();之后、dialog.show();之前添加代码:
// 清除阻止软键盘弹出的核心标志 dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); // 可选:设置软键盘初始状态,这里设为隐藏,可根据需求改为SOFT_INPUT_STATE_VISIBLE dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
方案2:显式声明EditText的可聚焦属性
虽然EditText默认支持聚焦,但在Dialog的嵌套布局中,显式声明属性能避免一些意外问题。打开你的列表项布局row.xml,给EditText添加以下属性:
android:focusable="true" android:focusableInTouchMode="true"
方案3:手动监听焦点并强制弹出软键盘
如果前两个方案不生效,可以在Adapter的getView方法里给EditText添加焦点监听,主动唤起软键盘:
修改你的MycustomAdapter的getView方法(顺便优化了布局复用逻辑,避免重复创建视图):
@Override public View getView(int i, View view, ViewGroup viewGroup) { View view1; // 复用已有的视图,提升性能 if (view == null) { LayoutInflater linflater = getLayoutInflater(); view1 = linflater.inflate(R.layout.row, viewGroup, false); } else { view1 = view; } EditText editText = view1.findViewById(R.id.bomb); editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { // 获取输入法管理器并弹出软键盘 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT); } } }); return view1; }
顺便修正Adapter的小问题
你的getItem方法返回类型有误,应该返回ListItem而非String,否则会有类型不匹配隐患,修改为:
@Override public ListItem getItem(int i) { return Item.get(i); }
按照上面的方法调整后,你的EditText应该就能正常唤起软键盘了。
内容的提问来源于stack exchange,提问作者mohamed el jannous
相关产品推荐
相关产品推荐

