[Android 开发]Android webview 显示弹出窗口

Android webview对_blank弹出窗口处理。

  • 例如使用Facebook的网页授权登录sdk就需要用到,解决方案如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.morefun.sdk.view;
import com.morefun.sdk.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
@SuppressLint({ "SetJavaScriptEnabled""HandlerLeak" })
public abstract class BaseWebActivity extends Activity {
 private WebView mWebView = null;
 private WebProgressDialog mProgressBar = null;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  requestWindowFeature(Window.FEATURE\_NO\_TITLE);
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_base);
  initView();
 }
 public void initView() {
  this.mProgressBar = WebProgressDialog.createDialog(this);
  this.mWebView = (WebView) findViewById(R.id.web_view);
  mWebView.setInitialScale(100);
  mWebView.setWebChromeClient(new WebChromeClient());
  mWebView.setWebViewClient(new WrapWebClient());
  mWebView.getSettings().setBuiltInZoomControls(true);
  mWebView.getSettings().setJavaScriptEnabled(true);
  mWebView.getSettings().setSupportMultipleWindows(true);
  mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
  mWebView.getSettings().setLoadsImagesAutomatically(true);
  mWebView.getSettings().setLightTouchEnabled(true);
  mWebView.getSettings().setDomStorageEnabled(true);
  // localstorage
  mWebView.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);
  String appCachePath = getApplicationContext().getCacheDir()
    .getAbsolutePath();
  mWebView.getSettings().setAppCachePath(appCachePath);
  mWebView.getSettings().setAllowFileAccess(true);
  mWebView.getSettings().setAppCacheEnabled(true);
  mWebView.getSettings().setLoadWithOverviewMode(true);
 }
 public class WebChromeClient extends android.webkit.WebChromeClient {
  public WebView newWebView = null;
  @Override
  public void onProgressChanged(WebView view, int newProgress) {
   if (newProgress == 100) {
    mProgressBar.dismiss();
   } else {
    if (mProgressBar.isShowing() == false)
     mProgressBar.show();
   }
   super.onProgressChanged(view, newProgress);
  }
  public boolean onCreateWindow(WebView view, boolean dialog,
    boolean userGesture, Message resultMsg) {
   newWebView = new WebView(view.getContext());
   view.addView(newWebView);
   WebSettings settings = newWebView.getSettings();
   settings.setJavaScriptEnabled(true);
   // 这个setWebViewClient要加上,否则window.open弹出浏览器打开。
   newWebView.setWebViewClient(new WebViewClient());
   newWebView.setWebChromeClient(this);
   WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
   transport.setWebView(newWebView);
   resultMsg.sendToTarget();
   return true;
  }
  @Override
  public void onCloseWindow(WebView window) {
   if (newWebView != null) {
    newWebView.setVisibility(View.GONE);
    window.removeView(newWebView);
   }
  }
 
 
 }
 public class WrapWebClient extends WebViewClient {
  @Override
  public void onPageFinished(WebView view, String url) {
   mWebView.getSettings().setBlockNetworkImage(false);
   super.onPageFinished(view, url);
  }
 }
 public class BaseJsObject {
  @JavascriptInterface
  public void showProgressDialog() {
   if (mProgressBar.isShowing() == false)
    progressHander.sendEmptyMessage(1);
  }
  @JavascriptInterface
  public void hideProgressDialog() {
   progressHander.sendEmptyMessage(0);
  }
  @JavascriptInterface
  public void onClose() {
   BaseWebActivity.this.finish();
  }
  @JavascriptInterface
  public void toast(String msg) {
   Toast.makeText(BaseWebActivity.this, msg, Toast.LENGTH_SHORT)
     .show();
  }
 }
 public void function_goBack(View v) {
  this.onBackPressed();
 }
 public void addJavascript(Object js, String name) {
  mWebView.addJavascriptInterface(js, name);
 }
 public void loadUrl(String url) {
  mWebView.loadUrl(url);
 }
 private Handler progressHander = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   switch (msg.what) {
   case 0:
    mProgressBar.dismiss();
    break;
   case 1:
    mProgressBar.show();
    break;
   default:
    break;
   }
  }
 };
 public boolean dispatchKeyEvent(android.view.KeyEvent event) {
  if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
   return false;
  else
   return super.dispatchKeyEvent(event);
 };
}
  • 最重要的就是:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    mWebView.getSettings().setSupportMultipleWindows(true);
    mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);



    public boolean onCreateWindow(WebView view, boolean dialog,
        boolean userGesture, Message resultMsg) {
       newWebView = new WebView(view.getContext());
       view.addView(newWebView);
       WebSettings settings = newWebView.getSettings();
       settings.setJavaScriptEnabled(true);
       // 这个setWebViewClient要加上,否则window.open弹出浏览器打开。
       newWebView.setWebViewClient(new WebViewClient());
       newWebView.setWebChromeClient(this);
       WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
       transport.setWebView(newWebView);
       resultMsg.sendToTarget();
       return true;
      }
      @Override
      public void onCloseWindow(WebView window) {
       if (newWebView != null) {
        newWebView.setVisibility(View.GONE);
        window.removeView(newWebView);
       }
      }