WebChromeClient的简单使用

来源:互联网 发布:大数据都包括什么 编辑:程序博客网 时间:2024/05/16 06:55

WebChromeClient类可以实现这个功能,对JS的弹窗或新窗口进行处理,下面实现这样一个Demo,新打开窗口时,使用一个新的WebVIew打开

MainActivity

/** * 这是一个关于WebView的Demo * 当webview启动新的页面时,Native层产生相应的变化 */public class MainActivity extends AppCompatActivity {    private WebView mWvContent;    private RelativeLayout mRlSubContent;    private MyWebChrmoeClient mWebChrmoeClient;    private static final String URL_HOST = "http://www.huffingtonpost.com/";    private Button mBtnClose;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        // 设置WebView属性        WebSettings settings = mWvContent.getSettings();        // 支持JavaScript        settings.setJavaScriptEnabled(true);        // 支持JS回调java方法        settings.setJavaScriptCanOpenWindowsAutomatically(true);        // 支持双击缩放        settings.setSupportZoom(true);        // 启用地理定位        settings.setGeolocationEnabled(true);        // 设置多窗口支持,设置为true时,必须重写onCreateWindows()方法        settings.setSupportMultipleWindows(true);        //支持存储        settings.setAppCacheEnabled(true);        settings.setDatabaseEnabled(true);        settings.setDomStorageEnabled(true);        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);        settings.setAppCachePath(getApplicationContext().getDatabasePath("myAppCache").getAbsolutePath());        settings.setDatabasePath(getApplicationContext().getDatabasePath("myDatabase").getAbsolutePath());        // 协助处理Web页面状态        mWvContent.setWebViewClient(new WebViewClient() {            @TargetApi(Build.VERSION_CODES.LOLLIPOP)            @Override            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {                String uri = request.getUrl().toString();                Log.v("LOGGER", "Uri: " + uri);                view.loadUrl(uri);                return true;            }        });        mWvContent.setWebChromeClient(mWebChrmoeClient);        mWvContent.loadUrl(URL_HOST);    }    /**     * 添加Back键回退功能     *     * @param keyCode     * @param event     * @return     */    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (mWvContent != null) {            if (event.getAction() == KeyEvent.ACTION_DOWN) {                switch (keyCode) {                    case KeyEvent.KEYCODE_BACK: // Back键                        if (mWvContent.canGoBack()) {                            mWvContent.goBack();                            return true;                        }                        break;                }            }        }        return super.onKeyDown(keyCode, event);    }    private void initView() {        mWvContent = (WebView) findViewById(R.id.id_wv_content);        mRlSubContent = (RelativeLayout) findViewById(R.id.id_rl_sub_content);        mWebChrmoeClient = new MyWebChrmoeClient(this, mRlSubContent);        mBtnClose = (Button) findViewById(R.id.id_btn_close_child);        mBtnClose.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                mWebChrmoeClient.closeSubView();            }        });    }}

WebChromeClient:

/** * Created by shixi_tianrui1 on 16-9-22. * WebView打开新的窗口时启动Activity */public class MyWebChrmoeClient extends WebChromeClient {    private RelativeLayout mSubView;    private Context mContext;    private TextView mTvTitle;    public MyWebChrmoeClient(Context context, RelativeLayout suvView) {        mContext = context;        mSubView = suvView;        mTvTitle = (TextView) mSubView.findViewById(R.id.id_tv_child_title);    }    // 创建一个新的窗口    @Override    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {        Toast.makeText(mContext, "onCreateWindows", Toast.LENGTH_SHORT).show();        mSubView.setVisibility(View.VISIBLE);        WebView webView = new WebView(mContext);        WebSettings webSettings = webView.getSettings();        webSettings.setJavaScriptEnabled(true);        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);        webSettings.setUseWideViewPort(false);        // 通过 新的WebView 打开新窗口        webView.setWebViewClient(new WebViewClient() {            @Override            public void onPageFinished(WebView view, String url) {                super.onPageFinished(view, url);                // 给子View设置文字                mTvTitle.setText("Title: " + view.getTitle());            }        });        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT                , ViewGroup.LayoutParams.MATCH_PARENT);        webView.setLayoutParams(params);        mSubView.addView(webView);        // 将新的窗口放在新创建的WebView中打开        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;        transport.setWebView(webView);        resultMsg.sendToTarget();        // 设置动画,打开新的WebView        Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.slide_up);        mSubView.setAnimation(animation);        return true;    }    /**     * 关闭子窗口     */    public void closeSubView() {        Log.v("LOGGER", "Close Sub Windows");        Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.slide_down);        mSubView.startAnimation(animation);        animation.setAnimationListener(new Animation.AnimationListener() {            @Override            public void onAnimationStart(Animation animation) {                Log.v("LOGGER", "onAnimationStart");            }            @Override            public void onAnimationEnd(Animation animation) {                Log.v("LOGGER", "onAnimationEnd");                mTvTitle.setText("");                mSubView.setVisibility(View.INVISIBLE);            }            @Override            public void onAnimationRepeat(Animation animation) {                Log.v("LOGGER", "onAnimationRepeat");            }        });    }    /**     * 是否已经打开新窗口     */    public boolean isOpenChild() {        return mSubView.getVisibility() == View.VISIBLE;    }}

布局文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="cn.edu.hebust.webviewdemo.MainActivity">    <WebView        android:id="@+id/id_wv_content"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <RelativeLayout        android:id="@+id/id_rl_sub_content"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:visibility="invisible">        <Button            android:id="@+id/id_btn_close_child"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerHorizontal="true"            android:text="@string/close" />        <TextView            android:id="@+id/id_tv_child_title"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_alignRight="@id/id_btn_close_child" />    </RelativeLayout></RelativeLayout>

动画:

slide.up.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"    android:shareInterpolator="false">    <translate        android:duration="500"        android:fromXDelta="0%"        android:fromYDelta="100%"        android:toXDelta="0%"        android:toYDelta="0%" /></set>

slide_down.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"    android:shareInterpolator="false">    <translate        android:duration="500"        android:fromXDelta="0%"        android:fromYDelta="0%"        android:toXDelta="0%"        android:toYDelta="100%" /></set>

首页
这里写图片描述

打开新的窗口,会产生动画,打开新的WebView

这里写图片描述

0 0