为什么在AlertDialog中加载带WebView的布局时软键盘无法弹出?
问题根因
AlertDialog的默认Window配置会拦截输入法触发逻辑,导致WebView内输入框获得焦点时无法唤起软键盘,你之前添加的焦点请求逻辑无法生效是因为Dialog窗口级的Flag限制。
修复步骤
1. 给WebView布局添加焦点属性
打开你的tip_developer_layout.xml,给WebView控件添加两个焦点属性:
<WebView android:id="@+id/tip_donation_webViewer" ... android:focusable="true" android:focusableInTouchMode="true" />
2. 修改AlertDialog的Window配置
在调用show()方法获取Dialog实例后,修改窗口Flag,放开输入法唤起权限。
3. 优化WebView触摸焦点逻辑
调整原有的触摸监听逻辑,直接给WebView申请焦点即可。
完整修改后代码
AlertDialog.Builder adb = new AlertDialog.Builder(MainActivity.this); adb.setIcon(R.drawable.ic_baseline_payment_32); adb.setTitle("Tip Developer"); View v = getLayoutInflater().inflate(R.layout.tip_developer_layout, null); WebView wv = v.findViewById(R.id.tip_donation_webViewer); WebSettings ws = wv.getSettings(); ws.setJavaScriptEnabled(true); // 此处替换为你的捐赠页面地址 wv.loadUrl(""); wv.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // 自定义错误处理逻辑 } public void onPageFinished(WebView view, String url) { wv.requestFocusFromTouch(); wv.requestFocus(View.FOCUS_DOWN); } }); // 优化后的触摸监听逻辑 wv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { view.requestFocus(); } return false; } }); adb.setPositiveButton("Close", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); } }); adb.setView(v); // 直接获取Dialog实例并修改窗口参数 AlertDialog dialog = adb.show(); Window window = dialog.getWindow(); if (window != null) { // 清除拦截输入法的默认Flag window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); // 配置软键盘适配规则,如需避免布局被挤压可替换为SOFT_INPUT_ADJUST_PAN window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); }
提示:如果代码中Window、WindowManager类报红,手动导入以下两个包即可:
import android.view.Window; import android.view.WindowManager;
额外注意
如果修改后还是无法唤起软键盘,检查你的Activity在AndroidManifest.xml中是否配置了android:windowSoftInputMode属性,不要设置为stateAlwaysHidden这类强制隐藏软键盘的配置即可。
内容的提问来源于stack exchange,提问作者user16891862
相关产品推荐
相关产品推荐

