制作好APP在真机上运行时发现页面总是略大于屏幕,查询网上的解决方法,通过Android原生webview设置分辨率啦、缩放啦、自适应等等,没啥用。后来看到X5WebView很多人赞,行吧,我也试试看好了。

走攻略下载X5WebView项目,主要从demo项目中复制下图对应文件夹下的文件到我的项目中来。


在gradle.properties中加入代码

android.useDeprecatedNdk=true


在build.gradle中defaultConfig {}块中写入代码

ndk{abiFilters "armeabi", "armeabi-v7a", "x86", "mips"}


然后呢,写一个类来使用X5WebView,在这里就要写好WebView导入了,不然会和Android元素WebView混一起。

我需要做一个内嵌网页的登录和登出,登录成功记住账号和密码,登出的时候登录页不显示注册页而是老用户登录页。

package com.example.com.hello1;import android.annotation.SuppressLint;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebSettings.LayoutAlgorithm;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import java.net.URISyntaxException;public class X5WebView extends WebView {static boolean isx5Reset = false;static boolean delay = false;static String x5url = "";static boolean IS_NEED_CLAER = false;private WebViewClient client = new WebViewClient() {/*** 防止加载网页时调起系统浏览器*/@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {WebView.HitTestResult hitTestResult = view.getHitTestResult();//hitTestResult==null解决重定向问题(刷新后不能退出的bug)if (!TextUtils.isEmpty(url) && hitTestResult == null) {return true;}if (shouldOverrideUrlLoadingByApp(view, url)) {return true;}return super.shouldOverrideUrlLoading(view, url);}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);//url.equals() 首页网址后面如果没有/结尾的话,该判断总是返回falseif (url.equals(MainActivity.reurl)) {   //限制只有首页url操作if (MainActivity.USERNAME != "") view.loadUrl("javascript:(function() { document.getElementById('username').value='" + MainActivity.USERNAME + "';"+ "document.getElementById('password').value='" + MainActivity.PASSWORD + "';document.getElementsByClassName('Login')[0].style.display = 'block';document.getElementsByClassName('Register')[0].style.display = 'none';})()");//通过loadUrl进行JavaScript函数操作,进行元素的赋值、设置可见属性}if (!delay) {delay = true;view.setBackgroundColor(Color.TRANSPARENT);  //设置背景透明,这个可以处理加载网页前的白屏,白屏闪一下在显示页面最讨厌了view.setVisibility(View.VISIBLE); //之前设置了背景图片,该web设置了隐藏,页面加载完毕就把它显示出来,且只执行一次,delay约束}if (url.equals("退登网址")) {MainActivity.getStr();//静态重读账号和密码的SharedPreferences数据view.loadUrl(MainActivity.reurl);//退登后马上进入登录页面IS_NEED_CLAER = true;//清除访问的历史记录}}@Overridepublic void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {super.onReceivedError(view, errorCode, description, failingUrl);// 在这里显示自定义错误页if (!isx5Reset) {//约束网络异常时reset.html只加载一次isx5Reset = true;x5url = failingUrl;view.loadUrl("file:///android_asset/html/reset.html");}}@Overridepublic void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {super.doUpdateVisitedHistory(view, url, isReload);if (IS_NEED_CLAER) {IS_NEED_CLAER = false;view.clearHistory();//清除历史记录}}};@SuppressLint("SetJavaScriptEnabled")public X5WebView(Context arg0, AttributeSet arg1) {//X5WebView初始化super(arg0, arg1);this.setWebViewClient(client);initWebViewSettings();this.getView().setClickable(true);}private void initWebViewSettings() {WebSettings mWebSettings = this.getSettings();mWebSettings.setJavaScriptEnabled(true);mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);mWebSettings.setAllowFileAccess(true);mWebSettings.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);mWebSettings.setSupportZoom(true);mWebSettings.setBuiltInZoomControls(true);mWebSettings.setUseWideViewPort(true);mWebSettings.setSupportMultipleWindows(true);mWebSettings.setAppCacheEnabled(true);mWebSettings.setDomStorageEnabled(true);mWebSettings.setGeolocationEnabled(true);mWebSettings.setAppCacheMaxSize(Long.MAX_VALUE);mWebSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);mWebSettings.setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);}public X5WebView(Context arg0) {super(arg0);setBackgroundColor(85621);}/*** 根据url的scheme处理跳转第三方app的业务*/private boolean shouldOverrideUrlLoadingByApp(WebView view, String url) {if (url.startsWith("http") || url.startsWith("https") || url.startsWith("ftp")) {//不处理http, https, ftp的请求return false;}Intent intent;try {intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);} catch (URISyntaxException e) {//            XLLog.e(TAG, "URISyntaxException: " + e.getLocalizedMessage());return false;}intent.setComponent(null);try {getContext().startActivity(intent);} catch (ActivityNotFoundException e) {//XLLog.e(TAG, "ActivityNotFoundException: " + e.getLocalizedMessage());return false;}return true;}
}

载入X5内核的初始化需要定义MyApplication类,且AndroidManifest.xml中application的name名就为MyApplication。首次打开APP就需要成功加载X5内核,失败则用原生的WebView

package com.example.com.hello1;import android.app.Application;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;import com.tencent.smtt.sdk.QbSdk;public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();preinitX5WebCore();//预加载x5内核Intent intent = new Intent(this, AdvanceLoadX5Service.class);startService(intent);}private void preinitX5WebCore() {if (!QbSdk.isTbsCoreInited()) {QbSdk.preInit(getApplicationContext(), null);// 设置X5初始化完成的回调接口}}// x5 init servicepublic class AdvanceLoadX5Service extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();initX5();}private void initX5() {//  预加载X5内核QbSdk.initX5Environment(getApplicationContext(), cb);}QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {@Overridepublic void onViewInitFinished(boolean arg0) {// TODO Auto-generated method stub//初始化完成回调}@Overridepublic void onCoreInitFinished() {// TODO Auto-generated method stub}};}
}

Android Studio 嵌入X5WebView相关推荐

  1. Android Studio 实现将视频资源嵌入APP中

    Android Studio 实现将视频资源嵌入APP中 (直取思路跟代码跳转文末,如有帮助勿忘分享点赞奥!你的支持是我更新的动力!) 在正文之前首先想给大家引入安卓数据存储路径: 内部存储inter ...

  2. Android Studio 使用腾讯浏览服务(替换掉系统自带的WebView)

    一.为何不直接使用内置的WebView组件? 用Android自带的WebView组件,做过一些较复杂应用的人应该都会发现,这个自带的组件很多时候真是让人无力吐嘈,主要理由有二: Android中的W ...

  3. 你所不知道的 Android Studio 调试技巧

    Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样, ...

  4. Android Studio 提示与技巧(官方文档翻译)

    这是翻译官方的文档,英语好的可以直接去官方文档查看,英语不好,大家就将就看吧,算是我翻译的第一篇技术文章,因为是个英语渣,技术也渣,所以最近在学英语,就尝试着自己来翻译,不过翻译有不好的地方,大家可以 ...

  5. 你所不知道的Android Studio调试技巧

    原文链接:简书@涅槃1992 http://www.jianshu.com/p/011eb88f4e0d Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为 ...

  6. android 自定义模板下载,android studio 自定义模板

    由于项目用上了 mvp 架构,基本上一个页面就至少需要新创建6个类,分别是 model view presenter 的接口以及其对应的实现类,再加上使用 dagger 的话就要更多了,所以这时候 a ...

  7. Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  8. Android Studio Gradle构建脚本

    Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 构建工具就是对你的项目进行 ...

  9. Android studio JNI jni实例

    1.Jni的作用 1.Jni的作用 Java是一种比较高级的语言,Java调用c库,调用c++库是必不可少的,所以Jni就应运而生了.看了这个文章的同学,应该能够自己写个APK装在自己的手机里面吧,以 ...

  10. android studio json插件_热门Android Studio 插件,这里是Top 20

    Android Studio是Google基于IntelliJ开发的一款功能强大的开发工具,它具有构建出色Android应用所需要的一切.借助基于IntelliJ IDEA的强大的功能,插件非常丰富. ...

最新文章

  1. 单细胞转录组专题研讨会第二期
  2. 基于深度学习的脑电图识别 综述篇(三)模型分析
  3. 马斯克SpaceX内部信曝光:戒骄戒躁,我们的首要任务是星际飞船
  4. SQL Server 行列转换(1)
  5. 同事删库跑路后,我连表名都不能修改了?
  6. 计算机包含着什么,计算机基础的包含是什么?
  7. c语言prime函数怎么用_C语言教程_v20201106
  8. Android 使用ViewPager实现画廊Gallery效果
  9. 【渝粤题库】陕西师范大学200591 英语语法
  10. 免安装版的Mysql
  11. VS2010 上手案例---hello word
  12. 麒麟操作系统激活相关问题
  13. Javascript格式化工具
  14. 人大金仓数据库sql语句_人大金仓数据库问题记录
  15. 微信小程序的事件大全
  16. 什么是共模干扰和差模干扰,它们是怎么产生的
  17. 拈一朵不悔的缘识之花,为你静候流年
  18. Python数据分析与可视化概述
  19. 用不可逆算法MD5进行加密后,如何进行登录验证
  20. 怎样在latex中插入jpg图片

热门文章

  1. FishC《零基础学习python》笔记-- 第014讲、15讲、16讲:字符串:各种奇葩的内置方法、格式化;序列
  2. PHP导出excel文件的多种方式
  3. deb微信安装 Ubuntu20.04
  4. 搭建一个属于自己的语音对话机器人
  5. Python解析ofd文件
  6. Android插件化实现方案
  7. 安卓版 网易云音乐 6.4.3
  8. FANUC服务器维修,FANUC系统401报警维修处理
  9. Android端记录跑步计步运动轨迹数据的App
  10. 想以游戏纸娃娃系统专利主张暴雪的暗黑3侵权? 先过暗黑2这关!