Adnroid WebView使用,js互動與彈窗設定
阿新 • • 發佈:2019-02-03
package com.zy.tour.usercenter; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.webkit.JavascriptInterface; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.LinearLayout; import android.widget.Toast; import com.zy.tour.BaseActivity; import com.zy.tour.R; import com.zy.tour.usercenter.personalcenter.PersonalCenterActivity; import com.zy.tour.usercenter.utils.ContantsUtils; import com.zy.tour.usercenter.utils.SaveData; import com.zy.tour.util.app.LApplication; import com.zy.tour.util.ui.TitleLayout; @SuppressLint({ "SetJavaScriptEnabled", "JavascriptInterface" }) public class WapLoginActivity extends BaseActivity implements ContantsUtils, OnClickListener { private WebView webView;// 內容頁 private TitleLayout titleLayout;// 頂部欄 private Activity mContext; private LinearLayout waitLayout;// 等待Layout @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user_wap_login); mContext = this; titleLayout = (TitleLayout) findViewById(R.id.top); webView = (WebView) findViewById(R.id.webview123); waitLayout = (LinearLayout) findViewById(R.id.linearlayout_progressbar_wait); titleLayout.getTitleTextView().setText("使用者"); titleLayout.getRightImageView().setVisibility(View.VISIBLE); titleLayout.getRightImageView().setImageResource(R.drawable.refresh); titleLayout.getRightImageView().setOnClickListener(this); webView.getSettings().setJavaScriptEnabled(true);// 可以使用javaScriptEnalsed webView.getSettings().setCacheMode(2);// 不使用快取 webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webView.addJavascriptInterface(new JsObject(), "demo"); webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("tel:")) {// 打電話 Intent intent = new Intent(Intent.ACTION_CALL, Uri .parse(url)); mContext.startActivity(intent); } else if (url.startsWith("sms:")) {// 發短息 Uri uri = Uri.parse("smsto:" + url.split(":")[1]); Intent sendIntent = new Intent(Intent.ACTION_VIEW, uri); sendIntent.putExtra("sms_body", ""); mContext.startActivity(sendIntent); } else {// 正常處理url view.loadUrl(url); } return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); waitLayout.setVisibility(View.VISIBLE); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); waitLayout.setVisibility(View.GONE); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { waitLayout.setVisibility(View.GONE); super.onReceivedError(view, errorCode, description, failingUrl); Toast.makeText(mContext, description + "\n" + failingUrl, Toast.LENGTH_LONG).show(); } }); webView.setWebChromeClient(new MyWebChromeClient());// 設定瀏覽器可彈窗 webView.loadUrl("url"); } /** * 瀏覽器可彈窗 * * @author Administrator * */ final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(mContext) .setTitle("App Titler") .setMessage(message) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.confirm(); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.cancel(); } }).create().show(); return true; } } /** * js呼叫class * * @author Administrator * */ class JsObject {//@JavascriptInterface是為了支援4.2及以上的js互動,不支援4.0以上的Android系統. @JavascriptInterface public void loginsuc(final String code, final boolean flag) { SaveData.saveData(mContext, code, "true"); LApplication.setCode(code); Log.e("code", code + flag); if (flag) { mContext.startActivity(new Intent(mContext, PersonalCenterActivity.class)); finish(); } } @JavascriptInterface public String toString() { return "demo"; } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.right_imagview:// 重新整理 webView.reload(); break; default: break; } } }
關於
彈窗設定:
webview載入了一個頁面,頁面裡點某一個button時候彈出一個確認對話方塊,這個對話方塊怎麼也不顯示如果直接用系統自帶的瀏覽器是可以彈出來的請問是怎麼回事?webview載入了一個頁面,頁面裡點某一個button時候彈出一個確認對話方塊,這個對話方塊怎麼也不顯示如果直接用系統自帶的瀏覽器是可以彈出來的
請問是怎麼回事?
解決方法:(未經證實)
1。
過載WebChromeClient的onJsConfirm方法
final Context myApp = this;
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
new AlertDialog.Builder(myApp)
.setTitle("App Titler")
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
result.confirm();
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
result.cancel();
}
})
.create()
.show();
return true;
}
}
2。
重寫onCreateWindow即可
@Override
public boolean onCreateWindow(WebView view, boolean dialog,
boolean userGesture, Message resultMsg) {
WebView childView = new WebView(getActivity());
final WebSettings settings = childView.getSettings();
settings.setJavaScriptEnabled(true);
childView.setWebChromeClient(this );
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(childView);
resultMsg.sendToTarget();
mHadOnCreateWindow = true;
return true;
}
記得要
final WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);