WebView 打开弹窗活动出错,魅族手机出错

本文介绍了一种解决Android应用程序中UI线程异常的方法。通过创建一个主线程Handler,在子线程中发送消息到主线程,从而避免了CalledFromWrongThreadException异常。此方案适用于需要在非UI线程更新UI的情况。
Thread [JavaBridge] (Suspended (exception ViewRootImpl$CalledFromWrongThreadException))    
    ViewRootImpl.checkThread() line: 6531    
    ViewRootImpl.invalidateChildInParent(int[], Rect) line: 913    
    RelativeLayout(ViewGroup).invalidateChild(View, Rect) line: 4702    
    RelativeLayout(View).invalidateInternal(int, int, int, int, boolean, boolean) line: 11836    
    RelativeLayout(View).invalidate(boolean) line: 11800    
    Button(View).setFlags(int, int) line: 9805    
    Button(View).setVisibility(int) line: 6707    
    CommonWebViewScriptBarActivity.closeModel() line: 631    
    WebViewScript.CloseModelPopView() line: 122    
    SystemMessageHandler.nativeDoRunLoopOnce(long, long) line: not available [native method]    
    SystemMessageHandler.handleMessage(Message) line: 53    
    SystemMessageHandler(Handler).dispatchMessage(Message) line: 102    
    Looper.loop() line: 135    

    HandlerThread.run() line: 61   

  解决方案如下:

主线程建Handler


 private class  MainHandler  extends Handler{
        /**
         * Subclasses must implement this to receive messages.
         */
        public void handleMessage(Message msg) {
            switch(msg.what){
            case 1:
             btnRight.setVisibility(View.INVISIBLE);
             btnRight.setText("");
           break;
           
            default:
                break;
            
            }
        }
        

    }


Message msg = new Message();
        msg.what = 0;
        mainHandler.sendMessage(msg);


这样就ok了

### 实现 Android WebView弹窗功能 要在 Android WebView 中启用 JavaScript 并支持 `alert` 和其他类型的对话框,需要通过设置 `WebSettings` 来开启 JavaScript 支持,并为 WebView 设置 `WebChromeClient` 以便处理 JavaScript 对话框。 以下是完整的配置方法以及示例代码: #### 启用 JavaScript 支持 为了使 WebView 能够执行 JavaScript,必须调用 `setJavaScriptEnabled(true)` 方法来启用它。这是显示弹窗的基础条件之一[^1]。 ```java // 初始化 WebView WebView webView = findViewById(R.id.webView); // 获取 WebSettings 并启用 JavaScript WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); ``` #### 处理 JavaScript 对话框 为了让 WebView 正确响应 JavaScript 弹窗(如 `alert`, `confirm`, 或 `prompt`),需要为其设置自定义的 `WebChromeClient`。这可以通过重写相应的方法来完成。 ```java webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { // 显示系统的 AlertDialog 替代默认行为 new AlertDialog.Builder(view.getContext()) .setTitle("JavaScript Alert") .setMessage(message) .setPositiveButton(android.R.string.ok, (dialog, which) -> result.confirm()) .setCancelable(false) .create() .show(); return true; } @Override public boolean onJsConfirm(WebView view, String url, String message, JsResult result) { // 显示确认对话框 new AlertDialog.Builder(view.getContext()) .setTitle("JavaScript Confirm") .setMessage(message) .setPositiveButton(android.R.string.ok, (dialog, which) -> result.confirm()) .setNegativeButton(android.R.string.cancel, (dialog, which) -> result.cancel()) .setCancelable(false) .create() .show(); return true; } }); ``` #### 加载网页内容 最后一步是加载目标 URL 到 WebView 中。可以使用本地 HTML 文件或者远程网站地址作为输入源。 ```java webView.loadUrl("https://example.com"); ``` --- ### 完整代码示例 以下是一个综合性的完整代码片段,展示了如何在 Android 应用程序中实现 WebView弹窗功能。 ```java import android.os.Bundle; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webView); // 配置 WebView 属性 WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); // 启用 JavaScript // 设置 WebChromeClient 用于处理 JavaScript 对话框 webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Toast.makeText(MainActivity.this, "JS Alert: " + message, Toast.LENGTH_SHORT).show(); result.confirm(); // 关闭对话框 return true; } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(MainActivity.this) .setTitle("Confirmation Required") .setMessage(message) .setPositiveButton(android.R.string.ok, (dialog, which) -> result.confirm()) .setNegativeButton(android.R.string.cancel, (dialog, which) -> result.cancel()) .create() .show(); return true; } }); // 加载测试页面 webView.loadUrl("file:///android_asset/test.html"); // 使用本地文件或外部链接 } @Override public void onBackPressed() { if (webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } } ``` --- ### 禁用长按上下文菜单 如果希望禁用 WebView 图片或其他元素上的长按操作所触发的上下文菜单,则可以在 WebView 上覆盖 `onCreateContextMenu` 方法并阻止其创建[^2]。 ```java @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { if (v.getId() == R.id.webView) { return; // 不创建上下文菜单 } super.onCreateContextMenu(menu, v, menuInfo); } // 或者直接禁用 WebView 的上下文菜单 webView.setOnLongClickListener(v -> true); ``` --- ### 注意事项 - 如果应用涉及敏感数据传输,建议检查 Cookie 的安全性设置[^3]。 - 测试时应确保设备运行的是最新版本的操作系统以获得最佳兼容性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值