Android WebView中的JavaScript警报仅在第一时间工作

时间:2012-04-19 09:02:54

标签: android android-webview

我是Stack Exchange和Andorid开发的新手。

我正在开发Android webview。我的活动类中有以下代码。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    WebView wv;
    WebSettings ws;

    try {
      wv = (WebView) findViewById(R.id.webview);
      ws = wv.getSettings();

      ws.setJavaScriptCanOpenWindowsAutomatically(true);
      ws.setJavaScriptEnabled(true);

      wv.clearCache(true);
      wv.loadUrl("http://<ip address>:<port>/<context>");
    } catch (Exception e) {
      e.printStackTrace();
    }
}

在layout-main.xml中:

<WebView 
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
    />
AndroidManifest.xml中的

<uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".POCActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

在url中,我有index.html,代码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Contact Example</title>
    <script type="text/javascript">
        alert("Start");
    </script>
  </head>
  <body>
    <p>Database 1</p>
    <div id="test"></div>
  </body>
</html>

工作环境:    - Eclipse indigo    - Android SDK min版本10    - 构建目标2.3.3

但是android代码只工作一次,即当我创建一个新的android项目并运行相同时,我可以看到javascript警报出现。从下次未显示javascript警报。即使是html页面中的任何文本更改(比如我将“数据库1”修改为“数据库2”)也不会显示。

我尝试了以下内容:    - 清除appcache    - 卸载应用程序,然后再次运行该项目    - 清除

请告诉我这里我做错了什么。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

webView.setWebViewClient(new WebViewClient());
webView.setWebChromeClient(new WebChromeClient());   

在我的代码中使用这些,然后我的alert()完美地运行

答案 1 :(得分:0)

这是一个非常老的问题,但是我最近遇到了同样的问题,并希望与以后遇到此问题的任何人分享解决方案。

您需要为WebView分配自定义WebChromeClient来处理警报。

mWebView.webChromeClient = object : WebChromeClient() {
    override fun onJsAlert(view: WebView?, url: String?, message: String?, result: JsResult?): Boolean {
        val alertDialog = AlertDialog.Builder(context)
                    .setMessage(message)
                    .setPositiveButton("OK") { dialogInterface, _ ->
                        dialogInterface.dismiss()
                        result?.confirm()
                    }
                    .setOnCancelListener { result?.cancel() }
                    .setCancelable(true)
                    .create()
        alertDialog.setCanceledOnTouchOutside(true)
        alertDialog.show()

        //Here AlertDialog is just an example. You can also simply show a Toast.
        //But remember to call JsResult.confirm() or JsResult.cancel()

        return true
    }
}

您需要调用JsResult.confirm()JsResult.cancel()来通知WebView用户是否确认或取消了警报对话框。否则,WebView将假定仍显示警告对话框(阻止UI),并且不允许显示新对话框。