Android WebView 进价高级使用

本文详细介绍WebView在Android应用中的高级定制与优化方法,包括错误页面处理、网站Logo替换、图片下载与设置壁纸、视频全屏播放、阻止App下载、广告过滤、微信支付集成、QQ登录支持、页面内容修改及Fragment中返回键处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

  • 无网络或加载错误时显示本地HTML
  • 修改网站logo图
  • 长按可以下载图片
  • 支持视频全屏播放
  • 禁止页面下载App
  • 过滤掉烦人的广告
  • 支持网页版微信支付
  • 支持网页版支付宝付款
  • 支持第三方QQ一键登录
  • 通过jsoup修改页面内容
  • 通过注入JS代码 修改网页内容
  • WebView在Fragment中返回键的处理
  • 。。。

无网络或加载错误时显示本地HTML

WebView加载网页,那么,自然是有加载错误的时候,或者手机无网络连接,这时总不能显示空白吧!显示本地html5提示用户无网络或是无数据界面。
在这里插入图片描述

		@Override
		public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
			videowebview.loadUrl("file:///android_asset/error.html");
		}

修改网站logo图

        @Override
		public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
			url = url.toLowerCase();
			if(url.contains("images/wap/manhua/v1/logo.png")){
				try {
					return new WebResourceResponse("image/png", "utf-8", getAssets().open("ic_launcher.png"));
				} catch (IOException pE) {
					pE.printStackTrace();
				}
			}
		}

长按可以下载图片

mWebView .setOnLongClickListener(this); 
	@Override
	public boolean onLongClick(View v) {
		WebView webView = (WebView) v;
		HitTestResult hr = webView.getHitTestResult();

		//
		int type = hr.getType();
		if (type == HitTestResult.IMAGE_TYPE || type == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
			//
			final String imageUrl = hr.getExtra();

			if (!imageUrl.startsWith("http")) {
				return false;
			}
			final View dialogView = getLayoutInflater().inflate(R.layout.dialog_layout, null);
			final AlertDialog alertDialog = new AlertDialog.Builder(
					MainActivity.this).setView(dialogView).create();
			dialogView.findViewById(R.id.save_tv).setOnClickListener(
					new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							downLoad(imageUrl, false);
							alertDialog.dismiss();
						}
					});
			dialogView.findViewById(R.id.wall_tv).setOnClickListener(
					new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							downLoad(imageUrl, true);
							alertDialog.dismiss();
						}
					});
			alertDialog.show();

			return true;
		}

		return false;
	}

	private void downLoad(String imageUrl, boolean wall) {
		int desiredMinimumWidth = getWindowManager().getDefaultDisplay()
				.getWidth();
		int desiredMinimumHeight = getWindowManager().getDefaultDisplay()
				.getHeight();

		FileDownLoad fileDownLoad = new FileDownLoad(MainActivity.this,
				imageUrl, "png", desiredMinimumWidth, desiredMinimumHeight,
				wall);
		fileDownLoad.enqueue(this, imageUrl, "图片下载");
	}

FileDownLoad

package XXX;

import java.io.File;
import java.io.IOException;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.app.WallpaperManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore.MediaColumns;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.MimeTypeMap;
import android.widget.Toast;

public class FileDownLoad {

    private long id;
    private DownloadManager manager;
    private Request request;
    private RequestCompleteReceiver completeReceiver;
    private String type, pathStr;
    private Context mcontext;
    private int desiredMinimumWidth, desiredMinimumHeight;
    private boolean wall;
    public FileDownLoad(Context context, String url, String type, int width, int height,boolean wall) {
        this.mcontext = context;
        this.wall = wall;
        this.desiredMinimumWidth = width;
        this.desiredMinimumHeight = height;
        completeReceiver = new RequestCompleteReceiver();
        context.registerReceiver(completeReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        this.type = type;
        manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
        request = new Request(Uri.parse(url));

        request.setAllowedNetworkTypes(Request.NETWORK_MOBILE | Request.NETWORK_WIFI);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
            request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        //
        request.setVisibleInDownloadsUi(true);
        //
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
            File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
            if (!file.exists()) {
                file.mkdirs();
            }
            Log.e("TAG", file.getAbsolutePath());
            String suffix = url.substring(url.lastIndexOf("/"));
            pathStr = file.getAbsolutePath() + "/" + suffix;
            Log.e("图片下载路径", pathStr);
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, suffix);
        }
        //
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
        String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url));
        request.setMimeType(mimeString);
    }

    private void setWallay(String pathStrT) {
        try {
            if(TextUtils.isEmpty(pathStr)){
                pathStr=pathStrT;
            }

            Bitmap bitmap = BitmapFactory.decodeFile(pathStr);
            WallpaperManager instance = WallpaperManager.getInstance(mcontext);
            instance.suggestDesiredDimensions(desiredMinimumWidth, desiredMinimumHeight);
            instance.setBitmap(bitmap);
            Toast.makeText(mcontext, "壁纸设置成功", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void enqueue(Context context, String title, String description) {
        if (id != 0) {
            manager.remove(id);
            id = 0;
        }
        //
        request.setTitle(title);
        //
        request.setDescription(description);
        id = manager.enqueue(request);
    }

    class RequestCompleteReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())) {
                long downloadCompleteId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                if (downloadCompleteId == id) {
                    context.unregisterReceiver(completeReceiver);
                    completeReceiver = null;

                    DownloadManager.Query query = new DownloadManager.Query();

                    query.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL);

                    Cursor c = manager.query(query);
                    String uriStr = "";
                    if (c.moveToFirst()) {
                        uriStr = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                    }
                    if(wall){
                        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
                            //file:///storage/emulated/0/Download/ybs-28.apk
                            if (!TextUtils.isEmpty(uriStr)) {
                                setWallay(uriStr);
                            }
                        } else {
                            File file = new File(getFilePathFromUri(context, Uri.parse(uriStr)));
                            setWallay(file.getAbsolutePath());
                        }
                    }else{
                        Toast.makeText(mcontext,"图片已保存",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }

    }

    /**
     * @param c
     * @param uri
     * @return
     */
    public String getFilePathFromUri(Context c, Uri uri) {
        String filePath = null;
        if ("content".equals(uri.getScheme())) {
            String[] filePathColumn = {MediaColumns.DATA};
            ContentResolver contentResolver = c.getContentResolver();
            Cursor cursor = contentResolver.query(uri, filePathColumn, null,
                    null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            filePath = cursor.getString(columnIndex);
            cursor.close();
        } else if ("file".equals(uri.getScheme())) {
            filePath = new File(uri.getPath()).getAbsolutePath();
        }
        return filePath;
    }
}

dialog_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:id="@+id/save_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存图片"
        android:padding="10dp"
        android:gravity="center"
        android:textSize="18sp"/>
        
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/black"/>
        
    <TextView
        android:id="@+id/wall_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="设置壁纸"
        android:padding="10dp"
        android:gravity="center"
        android:textSize="18sp"/>
        
</LinearLayout>

支持视频全屏播放

activity_details.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/video_view"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:visibility="gone" >
    </FrameLayout>

    <WebView
        android:id="@+id/web_details"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="0dp"
        android:layout_marginStart="0dp"
        android:layout_marginTop="55dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        >

    </WebView>

</android.support.constraint.ConstraintLayout>

java

@BindView(R.id.web_details)
WebView mWebDetails;
@BindView(R.id.video_view)
FrameLayout videoview;  // 全屏时视频加载view
private View xCustomView;
private xWebChromeClient xwebchromeclient;
private WebChromeClient.CustomViewCallback xCustomViewCallback;
xwebchromeclient = new xWebChromeClient();
mWebDetails.setWebChromeClient(xwebchromeclient);
    /**
     * 处理Javascript的对话框、网站图标、网站标题以及网页加载进度等
     * @author
     */
    public class xWebChromeClient extends WebChromeClient {
        
        private Bitmap xdefaltvideo;
        private View xprogressvideo;

        @Override
        // 播放网络视频时全屏会被调用的方法
        public void onShowCustomView(View view, CustomViewCallback callback) {
            //Only fullscreen activities can request orientation
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            mWebDetails.setVisibility(View.GONE);
            // 如果一个视图已经存在,那么立刻终止并新建一个
            if (xCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }
            videoview.addView(view);
            xCustomView = view;
            xCustomViewCallback = callback;
            videoview.setVisibility(View.VISIBLE);
        }

        @Override
        // 视频播放退出全屏会被调用的
        public void onHideCustomView() {
            // 不是全屏播放状态
            if (xCustomView == null) {
                return;
            }
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            xCustomView.setVisibility(View.GONE);
            videoview.removeView(xCustomView);
            xCustomView = null;
            videoview.setVisibility(View.GONE);
            xCustomViewCallback.onCustomViewHidden();
            mWebDetails.setVisibility(View.VISIBLE);
        }

        // 视频加载添加默认图标
        @Override
        public Bitmap getDefaultVideoPoster() {
            if (xdefaltvideo == null) {
                xdefaltvideo = BitmapFactory.decodeResource(getResources(), R.drawable.videoicon);
            }
            return xdefaltvideo;
        }

        // 视频加载时进程loading
        @Override
        public View getVideoLoadingProgressView() {
            if (xprogressvideo == null) {
                LayoutInflater inflater = LayoutInflater.from(DetailsActivity.this);
                xprogressvideo = inflater.inflate(R.layout.video_loading_progress, null);
            }
            return xprogressvideo;
        }
    }

禁止页面下载App

//禁止页面下载第三方App
videowebview.setDownloadListener(new DownloadListener() {  
			@Override
			public void onDownloadStart(String arg0, String arg1, String arg2, String arg3, long arg4) {
				try {
					Uri uri=Uri.parse(arg0);
					Intent intent=new Intent();
					intent.setAction(Intent.ACTION_VIEW);
					intent.setData(uri);
					intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");

					startActivity(intent);
				} catch (Exception e) {
					Uri uri=Uri.parse(arg0);
					Intent intent=new Intent(Intent.ACTION_VIEW,uri);
					startActivity(intent);
				}
			}
		});

过滤掉烦人的广告

        @Override
		public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
			url = url.toLowerCase();
			if(!url.contains(homeurl)){
				if (!ADFilterTool.hasAd(context, url)) {
					return super.shouldInterceptRequest(view, url);
				}else{
					return new WebResourceResponse(null,null,null);
				}
			}else{
				return super.shouldInterceptRequest(view, url);
			}
		}

2.在项目工具包中新建ADFilterTool类

public class ADFilterTool {

    public static boolean hasAd(Context context, String url) {
        Resources res = context.getResources();
        String[] adUrls = res.getStringArray(R.array.adBlockUrl);
        for (String adUrl : adUrls) {
            if (url.contains(adUrl)) {
                return true;
            }
        }
        return false;
    }
}

3.在values新建name="adBlockUrl"的AdUrlString.xml ,里面写的是你要屏蔽广告的域名,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="adBlockUrl">
        <item>ubmcmm.baidustatic.com</item>
        <item>cpro2.baidustatic.com</item>
        <item>cpro.baidustatic.com</item>
        <item>s.lianmeng.360.cn</item>
        <item>nsclick.baidu.com</item>
        <item>pos.baidu.com</item>
        <item>cbjs.baidu.com</item>
        <item>cpro.baidu.com</item>
        <item>images.sohu.com/cs/jsfile/js/c.js</item>
        <item>union.sogou.com/</item>
        <item>sogou.com/</item>
        <item>a.baidu.com</item>
        <item>c.baidu.com</item>
        <item>baid2.okooo.com</item>
        <item>baidu.mobads</item>
        <item>yiqiso.com</item>
        <item>googleads.g.doubleclick.net</item>
        <item>www.2345.com</item>
		<item>y.5125129.com</item>
		<item>s.051352.com</item>
        <item>s.6travel.com</item>
        <item>www.duote.com</item>
        <item>vps.gcx3.cn</item>
        <item>50bang.org</item>
    </string-array>
</resources>

支持网页版微信支付

        @Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			Log.i("webviewtest", "shouldOverrideUrlLoading: " + url);
			// 如下方案可在非微信内部WebView的H5页面中调出微信支付
			if (url.startsWith("weixin://wap/pay?")) {
				Intent intent = new Intent();
				intent.setAction(Intent.ACTION_VIEW);
				intent.setData(Uri.parse(url));
				startActivity(intent);
				return true;
			} else {
				Map<String, String> extraHeaders = new HashMap<String, String>();
				extraHeaders.put("Referer", "http://wxpay.wxutil.com");
				view.loadUrl(url, extraHeaders);
			}
			return true;

		}

支持第三方QQ一键登录

第一步:在activity的onCreate方法中写入下面代码,activity建议继承AppCompatActivity。这里还有很多关于webview的设置没发出来,自己知道补上就行。

        //当需要从一个网页跳转到另一个网页时,我们希望目标
        //网页仍然在当前WebView中显示,而不是打开浏览器
        mWebView.setWebViewClient(new NoAdWebViewClient());
        //4.4版本以上无法保存cookie,要是用代码去判断,开启第三方的cookie支持
        // Allow third party cookies for Android Lollipop
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptThirdPartyCookies(mWebView,true);
        }
        mWebView.loadUrl(mUrl);

第二步:在WebView的WebViewClient中shouldOverrideUrlLoading方法处理QQ登录跳转问题,主要拦截QQ相关的URL,自己打log看日志,好像有三个相关的链接,文中出现两个。QQ登录完成后有两个跳转选择,一个是浏览器,另一个是APP,一定要选择APP。

    /**
     * Created by Administrator on 2019/9/18.
     * 处理各种通知、请求等事件
     */
    public class NoAdWebViewClient extends WebViewClient {

        @Override//设置不用系统浏览器打开,直接显示在当前Webview
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.e("webviewtest", "shouldOverrideUrlLoading: " + url);

            //支持QQ一键登录
            //https://m.manhuatai.com/thirdlogin/?type=qq&referrer=
            if (url.startsWith("wtloginmqq://ptlogin/qlogin")) {
                mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(mIntent);
            }
            mWebView.loadUrl(url);

            return true;
        }

    }

第三步:重写onNewIntent方法,拿到登录成功后的URL。这行mUrl = intent.getData().toString();代码是重点,

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        mUrl = intent.getData().toString();
        Log.e("onNewIntent", "onNewIntent: ----->" +mUrl);
        mWebView.loadUrl(mUrl);
    }

第四步:也是最重要的一步,在AndroidManifest.xml中注册activity。

      <activity android:name="beid.wexd.tuoe.fragment.AiActivity"
            android:configChanges="orientation|keyboardHidden|navigation|screenSize"
            android:hardwareAccelerated="true"
            android:launchMode="singleTask"
            android:label="@string/app_name">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="https" android:host="ssl.ptlogin2.qq.com" android:path="/jump"/>
            </intent-filter>
        </activity>

通过注入JS代码 修改网页内容

/**
         * 页面加载结束时调用
         * @param view
         * @param url
         */
        @Override
        public void onPageFinished(WebView view, String url) {
            
            // hide element by class name
		   view.loadUrl("javascript:(function() { document.getElementsByClassName('hashover')[0].style.display='none'; })()");
			// hide element by id
		   view.loadUrl("javascript:(function() { document.getElementById('hashover').style.display='none';})()");
           super.onPageFinished(view, url);
            
        }
       

通过jsoup修改页面内容

通过jsoup修改页面内容这个就比较高端了,学这个的前提是你要会jsoup且懂一点前端知识;这里只放代码,感兴趣的自己先看看,不懂的地方评论区留言,在此之前可以也看下我的另一篇文章 Android 使用jsoup快速爬虫抓包

/**
 * Created by Administrator on 2018/9/29.
 * 思路是获取网页HTML,通过jsoup修改HTML代码,然后,使用WebView .loadDataWithBaseURL加载HTML出来。
 * 我这里的话是获取网页HTML中某个div的内容,然后,给这个片段HTML添加自己的网页头部代码,
 * 组合成一个完整简单的HTML。注释代码是我获取网页HTML内容,隐藏掉一些不想显示的内容。
 * @author 小红妹
 */

public class DetailsActivity extends BaseActivity {

    private static final int MESSAGE_ID = 0x1;
    @BindView(R.id.web_view_details)
    WebView mWebViewDetails;
    private String mUrl, mHtml;

    @Override
    protected int getLayoutId() {
        return R.layout.activity_details;
    }

    @Override
    protected void initView() {
        ButterKnife.bind(this);
      
    }

    @Override
    protected void initData() {
        mUrl = getIntent().getStringExtra("linkUrl");
        Log.e("mUrl", "initData: "+ mUrl);
        getData(mUrl);
    }

   @Override
    protected void initData() {
        mUrl = getIntent().getStringExtra("linkUrl");
        Log.e("mUrl", "initView: " + mUrl);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Document dm = Jsoup.connect(mUrl).get();
                    Elements dmMain = dm.select("div#list");
                    Log.e("dmmain", "dmmain: " + dmMain);
                    Elements li = dmMain.select("li");
                    for (int i = 0; i < li.size(); i++) {
                        mListEntity = new ListEntity();
                        Element mLi = li.get(i);
                        Log.e("mLi", "mLi: " + mLi);
                        Elements links = mLi.select("a[href]");
                        Log.e("links", "links: " + links);
                        String text = links.text();
                        if (links != null) {
                            screenData(i,links);
//                            mListEntity.setImg(links.attr("href"));
//                            mListEntity.setTitle(links.text());
//                            mList.add(mListEntity);
                        }

                    }
                    Elements dmPdjs = dm.select("div#pdjs");
                    Log.e("dmPdjs", "dmPdjs: " + dmPdjs);
                    dmPdjs.select("div#bdshare").attr("hidden", "hidden");
                    dmPdjs.select("p a").attr("style", "color:black;text-decoration:none;");
                    mHtml = dmPdjs.html();//dmMain.html() +
//                    if (mUrl.contains("http://m.zhiboo.net/")) {
//                        dmRow.select("div.video-box video").attr("preload", "auto");
//                        dmRow.select("div.video-box video").attr("data-setup", "{}");
//                        dmRow.select("div.video-box video").attr("tabindex", "-1");
//                        //后面加的,还有先前的代码,才出现全部按钮
////                        dmRow.select("div.video-box video").attr("x-webkit-airplay", "true");
////                        dmRow.select("div.video-box video").attr("x5-playsinline", "");
////                        dmRow.select("div.video-box video").attr("playsinline", "");
////                        dmRow.select("div.video-box video").attr("webkit-playsinline", "");
////                        dmRow.select("div.video-box video").attr("x5-video-player-type", "h5");
////                        dmRow.select("div.video-box video").attr("x5-video-player-fullscreen", "true");
//                        Elements dmRowA = dmRow.select("div.video-box");
//                        mHtml = dmRowA.html();
//                        //Log.e("dmRowA", "dmRowA: " + dmRowA.html());
//                        Log.e("mHtml", "mHtml: " + mHtml);
////                        mHtml = dm.outerHtml();
//                    } else {
//                        dmRow.select("div.wexin").attr("hidden", "hidden");
//                        dmRow.select("div.box-title").attr("hidden", "hidden");
//                        dmRow.select("div.pic_index_list").attr("hidden", "hidden");
//                        dmRow.select("div.player-list").attr("hidden", "hidden");
//                        dmRow.select("div.player-info").attr("hidden", "hidden");
//
//                        mHtml = dmRow.html();
//                        Log.e("dmRow", "dmRow: " + mHtml);
//                    }
                    //Elements dmUl = dm.select("div.column_wrapper_1000_xw_160113");
                    //dm.select("div.column_wrapper_160119").attr("hidden", "hidden");

                    //mHtml = dm.outerHtml();
                    //Elements dmP = dmUl.select("p.subinfo");
                    //dmUl.select("p.subinfo a").attr("onclick", "return false;");
                    //dmUl.select("p.subinfo a").attr("style", "color:black;text-decoration:none;");
                    //Elements signtext = dmRow.select("div.player-obj");


                    //带有href属性的a元素
                    //Elements links = dmUl.select("a[href]");
                    //umls = links.attr("href");
                    //Log.e("umls", "run: " + umls);
                    //title = dmRowA.text();
                    //mSigntext = signtext.text();
                    //mHtml = dmUl.outerHtml() + signtext.outerHtml();

                } catch (IOException pE) {
                    pE.printStackTrace();
                }
                //通过mHandler对象的obtainMessage()
                //方法得到一个消息msg对象实例
                Message msg = mHandler.obtainMessage();
                //封装消息ID
                msg.what = MESSAGE_ID;
                //通过mHandler对象将消息发送出去
                mHandler.sendMessage(msg);
            }
        }).start();
    }
    
    //创建一个Handler局部类对象
    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //得到封装的消息ID进行匹配
            if (MESSAGE_ID == msg.what) {
                setWebView();
            }
        }
    };

    private void setWebView() {
        WebSettings webSettings = mWebViewDetails.getSettings();
        // 支持javascript
        webSettings.setJavaScriptEnabled(true);
        // 支持使用localStorage(H5页面的支持)
        webSettings.setDomStorageEnabled(true);
        // 支持数据库
        webSettings.setDatabaseEnabled(true);
        // 支持缓
        webSettings.setAppCacheEnabled(true);
        String appCaceDir = this.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
        webSettings.setAppCachePath(appCaceDir);
        // 设置可以支持缩放
        webSettings.setUseWideViewPort(true);
        // 扩大比例的缩放
        webSettings.setSupportZoom(true);
        webSettings.setBuiltInZoomControls(true);
        // 隐藏缩放按钮
        webSettings.setDisplayZoomControls(false);
        // 自适应屏幕
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        webSettings.setLoadWithOverviewMode(true);
        // 隐藏滚动条
        mWebViewDetails.setHorizontalScrollBarEnabled(false);
        mWebViewDetails.setVerticalScrollBarEnabled(false);

        mWebViewDetails.loadDataWithBaseURL(null, getHtmlData(mHtml), "text/html;charset=utf-8", "utf-8", null);

        mWebViewDetails.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.contains("http://m.tingshouyinji.cn/play.php?id=")) {
                    getData(url);
                } else {
                    mWebViewDetails.loadUrl(url);
                }
                return true;
            }

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                url = url.toLowerCase();
                Log.e("view-url", "shouldOverrideUrlLoading: " + url);
                return super.shouldInterceptRequest(view, url);
            }
        });

        // 使用返回键的方式防止网页重定向
        mWebViewDetails.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    if (keyCode == KeyEvent.KEYCODE_BACK && mWebViewDetails.canGoBack()) {
                        mWebViewDetails.goBack();
                        //WebView返回键退出还在播放
                        mWebViewDetails.loadUrl("about:blank");
                        return true;
                    }
                }
                return false;
            }
        });

    }

    private String getHtmlData(String bodyHTML) {

        String head = "<head>" +
                "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\"> " +
                "<style>html{padding:15px;} body{word-wrap:break-word;font-size:13px;padding:0px;margin:0px}" +
                " p{padding:0px;margin:0px;font-size:13px;color:#222222;line-height:1.3;} " +
                "img{padding:0px,margin:0px;max-width:100%; width:auto; height:auto;}</style>" +
                "</head>";
        return "<html>" + head + "<body>" + bodyHTML + "</body></html>";
    }

WebView在Fragment中返回键的处理

在build.gradle添加

dependencies {
    implementation 'com.github.ikidou:FragmentBackHandler:2.1'
}

Fragment extends FragmentBackHandler

    /**
     * 处理返回键
     * @return
     */
    @Override
    public boolean onBackPressed() {
         if (videowebview.canGoBack()) {
            videowebview.goBack();// 让WebView回退到上一个网页
            return true;
        } else {
            videowebview.loadUrl("about:blank");
            // mTestWebView.loadData("", "text/html; charset=UTF-8", null);
            getActivity().finish();
        }
        return BackHandlerHelper.handleBackPress(this);
    }

获取当前页面的HTML

页面加载结束后获取当前页面HTML。

    yourWebView.evaluateJavascript(
            "(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();",
            new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String html) {
            Log.d("HTML", html);
            // Here you work with the content of the page which is stored in the 'html' variable
        }
    });

补充

隐藏单个标签元素

// 隐藏底部栏方法
 private void hideBottom() {
      try {
          //定义javaScript方法
           String javascript = "javascript:function hideBottom() { "
                 + "document.getElementsByClassName('weex')[0].style.display='none'"
                + "}";
 
          //加载方法
           mWebView.loadUrl(javascript);
        //执行方法
           mWebView.loadUrl("javascript:hideBottom();");
        } catch (Exception e) {
           e.printStackTrace();
        }
   }

隐藏多个相同标签元素

@Override
            public void onPageFinished(WebView webView, String s) {//xhm
                super.onPageFinished(webView, s);
                //定义javaScript方法
                String javascript = "javascript:function hideBottom() { "
                        + "var bar = document.querySelectorAll('.bar');"
                        + "for(i=0;i<bar.length;i++){ "
                        + "bar[i].style.display='none';}"
                        + "}";

                //加载方法
                webView.loadUrl(javascript);
                //执行方法
                webView.loadUrl("javascript:hideBottom();");
            }
              

参考链接(排名不分先后):

  • https://blog.youkuaiyun.com/yllp_1230/article/details/80655350
  • https://blog.youkuaiyun.com/abc6368765/article/details/52797111
  • https://blog.youkuaiyun.com/q232916067/article/details/82745853
  • https://www.jianshu.com/p/6e69332cf946
  • https://blog.youkuaiyun.com/maqianli23/article/details/53556467
  • https://www.jianshu.com/p/29ecf8c2c454
  • https://www.jianshu.com/p/fae23fcd5df2
  • 。。。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值