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
- WebChromeClient的简单使用
- WebViewClient 和 WebChromeClient的使用区别
- webkit下的WebChromeClient
- WebChromeClient
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- WebViewClient与WebChromeClient的区别
- <Android 基础(二十三)> Android Studio快捷键
- 【PowerDesigner】Mysql设计工具 16.5破解
- 如何从github中向eclipse导入一个开源项目(自定义控件)
- runtime源码探究(一) weak的实现
- 1. 什么是Node.js
- WebChromeClient的简单使用
- Git的介绍和安装
- 如何删除GitHub上的项目仓库
- Item4 Know how to view deduced types
- jquery即点即改
- Oracle rownum与分页
- LeetCode 153 Find Minimum in Rotated Sorted Array (二分)
- 开篇导论(操作系统概念第七版 第一章)
- 微机原理--第二章(3)8086的操作和时序