Android WebView的使用方法总结

 Android WebView的使用方法

Android app打开H5页一般要实现如下需求:

1、打开指定url网页;
2、点击链接可以跳转到下一页,并更新标题;
3、按back键或左箭头可以返回上一页;
4、当webview显示的是第一级url时, 按返回键或左箭头关闭当前界面;
5、WebView如何传值给android, 例如使用H5登录成功后返回姓名、token等等字段。
6、支持JavaScript, 支持显示js对话框。
7、无网络时显示默认布局, 以提高用户体验。
8、避免WebView的内存泄漏。

不多说, 看下面代码如何实现上述功能。

参考布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:my="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@color/activity_main_bg"
  android:orientation="vertical">

  <com.eloancn.borrower.common.widget.TitleView
    android:id="@+id/titleView"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    my:titleText="H5" />

  <RelativeLayout
    android:id="@+id/rl_webViewContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!--在代码中添加webView防止内存泄露隐患-->

    <LinearLayout
      android:id="@+id/neterror_tip"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:gravity="center_horizontal"
      android:visibility="gone">

      <ImageView
        android:layout_marginTop="110dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/not_found" />

    </LinearLayout>

  </RelativeLayout>
</LinearLayout>

示例代码:

public class CommonWebViewActivity extends Activity {
  private WebView mWebView;
  private TitleView mTitleView;
  private RelativeLayout mWebViewContainer;
  private String title;
  private String url;
  private LinearLayout neterrorLayout;
  private int mFlag;  //来源 

  public static final int FLAG_SIGNATURE = 1; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_common_webview_main);
    initData();
    initView();
    setData();
  } 

  @Override
  protected void onDestroy() {
    super.onDestroy();
    mWebView.setWebViewClient(null);
    mWebView.setWebChromeClient(null);
    mWebViewContainer.removeView(mWebView);
    mWebView.removeAllViews();
    mWebView.destroy();
  } 

  private void initData() {
    url = getIntent().getStringExtra("url");
    title = getIntent().getStringExtra("title");
    mFlag = getIntent().getIntExtra("flag", 0);
  } 

  private void initView() {
    mTitleView = (TitleView) findViewById(R.id.titleView);
    mWebViewContainer = (RelativeLayout) findViewById(R.id.rl_webViewContainer);
    neterrorLayout = (LinearLayout) findViewById(R.id.neterror_tip);
    mWebView = new WebView(getApplicationContext());
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
    mWebViewContainer.addView(mWebView, layoutParams); 

    WebSettings webSettings = mWebView.getSettings();
    //设置WebView属性,能够执行Javascript脚本
    webSettings.setJavaScriptEnabled(true);
    //设置可以访问文件
    webSettings.setAllowFileAccess(true);
    //设置支持缩放
    webSettings.setBuiltInZoomControls(false);
    //允许js弹出窗口
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true); 

    mTitleView.setLeftBtnClickListener(new TitleView.OnBtnClickListener() {
      @Override
      public void onClick(View v) {
        if (mWebView.canGoBack()) {
          mWebView.goBack();
        } else {
          finish();
        }
      }
    });
  } 

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
      if (mWebView.canGoBack()) {
        mWebView.goBack();
        return true;
      }
    }
    return super.onKeyDown(keyCode, event);
  } 

  private void setData() {
    mTitleView.setTitle(title);
    mWebView.loadUrl(url); 

    mWebView.setWebChromeClient(new WebChromeClient(){
      @Override
      public boolean onJsAlert(WebView view, String url, final String message, final JsResult result) {
        //注意,WebView默认不会显示JavaScript的Alert,需要Android实现。
        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            //自定义美观的Dialog,仅仅是为了显示message
            CustomDialog.Builder builder = new CustomDialog.Builder(CommonWebViewActivity.this);
            builder.setTitle("提示");
            builder.setMessage(message);
            builder.setSingle("知道了", new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
              }
            });
            builder.create().show();
          }
        });
        result.confirm();//这里必须调用,否则页面会阻塞造成假死
        return true;
      } 

      @Override
      public void onReceivedTitle(final WebView view, final String title) {
        super.onReceivedTitle(view, title);
        if (FLAG_SIGNATURE == mFlag) {
          runOnUiThread(new Runnable() {
            @Override
            public void run() {
              mTitleView.setTitle(title);
            }
          });
        }
      }
    });
    mWebView.setWebViewClient(new WebViewClient() {
      @Override
      public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        if (FLAG_SIGNATURE == mFlag) {
          Log.d("brycegao", "shouldInterceptRequest url:" + request.getUrl().toString());
          if (request.getUrl().toString().contains("wxd://getImage?tenderid=")) {
            //可以通过url传值给Android, 即在url里放置想要的参数
            runOnUiThread(new Runnable() {
              @Override
              public void run() {
                setResult(RESULT_OK);
                finish();
              }
            });
          } 

        }
        return super.shouldInterceptRequest(view, request);
      } 

      @Override
      public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        mWebView.loadUrl(url);
        return true;
      } 

      @Override
      public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
        super.onReceivedError(view, request, error); 

        if (FLAG_SIGNATURE == mFlag
            && request.getUrl().toString().contains("wxd://getImage?tenderid=")) {
          //do nothing
          mWebView.setVisibility(View.GONE); //优化体验,避免显示错误信息
        } else {
          //加载失败
          neterrorLayout.setVisibility(View.VISIBLE);
          mWebView.setVisibility(View.GONE);
        }
      }
    }); 

    neterrorLayout.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        mWebView.setVisibility(View.VISIBLE);
        neterrorLayout.setVisibility(View.GONE);
        mWebView.loadUrl(url);
      }
    });
  }
}

以上就是Android Webview的使用方法详解,大家如果有疑问可以留言讨论,或者到本站社区交流,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android webview 内存泄露的解决方法

    Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递getApplicationContext. 1.避免在xml直接写webview控件,这样会引用activity,所以在xml写一个LinearLayout,然后 linearLayout.addView(new MyWebview(getApplicati

  • Android实现webview实例代码

    webview是一个很简单的功能,代码没有什么逻辑上的难度,只是需要注意权限上的问题.其实在安卓编程的过程当中,权限问题可以算是出现的比较多的BUG. 1.MainAct package com.lxq.webview01; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.View.O

  • Android 解决WebView无法上传文件的问题

    Android 解决WebView无法上传文件的问题 Android原生的WebView并不支持上传文件,需要我们自己实现相应的方法.于是我把工作中的相关代码记录下来.下次直接拿来用就行了.一点一滴都是经验. 1.需要定义三个变量 private ValueCallback<Uri[]> uploadMessageAboveL; private final static int FILE_CHOOSER_RESULT_CODE = 10000; private ValueCallback<

  • 详解Android Webview加载网页时发送HTTP头信息

    详解Android Webview加载网页时发送HTTP头信息 当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer(引荐)发给服务器,因此很多服务器端程序通过是否包含referer来控制盗链,所以有些时候,直接输入一个网络地址,可能有问题,那么怎么解决盗链控制问题呢,其实在webview加载时加入一个referer就可以了,如何添加呢? 从Android 2.2 (也就是API 8)开始,WebView新增加了一个接口方法,就是为了便于我们加载网页时又想发送其他的HT

  • Android 5.1 WebView内存泄漏问题及快速解决方法

    问题背景 在排查项目内存泄漏过程中发现了一些由WebView引起的内存泄漏,经过测试发现该部分泄漏只会出现在android 5.1及以上的机型.虽然项目使用WebView的场景并不多,但秉承着一个泄漏都不放过的精神,我们肯定要把它给解决了. 遇到的问题 项目中使用WebView的页面主要在FAQ页面,问题也出现在多次进入退出时,发现内存占用大,GC频繁.使用LeakCanary观察发现有两个内存泄漏很频繁: 我们分析一下这两个泄漏: 从图一我们可以发现是WebView的ContentViewCo

  • Android WebView 不支持 H5 input type="file" 解决方法

    最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中.发现点击H5中 input type="file" 标签 不能打开android资源管理器. 通过网络搜索发现是因为 android webview 由于考虑安全原因屏蔽了 input type="file" 这个功能 . 经过不懈的努力,以及google 翻译的帮助 在 stackoverflow 中找到了解决的方法. 具体可以理解为 重写webview 的WebChrome

  • Android中WebView实现点击超链接启动QQ的方法

    前言 之前有次在面试的时候,面试官问了一个如何在WebView点击超链接启动类型QQ类似第三方应用,我当时的回答是用WebView与js交互可以做到.面试官听了没再说什么,应该是答案不是他期望的.今天发现原来可以这样实现,记录一下. 实现思路 在Web开发中,启动QQ来临时会话,可以通过一个URL链接 <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=748895431&site=qq&am

  • Android如何让WebView中的HTML5页面实现视频全屏播放

    前言 本文主要是将最近工作中遇到的一个问题进行总结分享,主要介绍的是如何让WebView中H5页面全屏播放视频.关于这个问题,做一下简单分析,希望对大家有所帮助,下面话不多说了,来看看详细的介绍吧. 效果图 运行效果 其实很简单,就是配置问题.关键地方配好了,基本没什么问题了. 硬件加速 设置WebView 在清单需要配置的AndroidManifest.xml <application android:allowBackup="true" android:icon="

  • Android WebView的使用方法及与JS 相互调用

    Android WebView的使用方法及与JS 相互调用 1.添加网络权限 <uses-permission android:name="android.permission.INTERNET" /> 2.WebSettings 对访问页面进行设置. WebView mWebView = new WebView(this); WebSettings webSettings = mWebView .getSettings();//支持获取手势焦点,输入用户名.密码或其他 m

  • Android WebView的使用方法总结

     Android WebView的使用方法 Android app打开H5页一般要实现如下需求: 1.打开指定url网页: 2.点击链接可以跳转到下一页,并更新标题: 3.按back键或左箭头可以返回上一页: 4.当webview显示的是第一级url时, 按返回键或左箭头关闭当前界面: 5.WebView如何传值给android, 例如使用H5登录成功后返回姓名.token等等字段. 6.支持JavaScript, 支持显示js对话框. 7.无网络时显示默认布局, 以提高用户体验. 8.避免We

  • Android Webview重定向问题解决方法

    项目中需要webview重定向,但是由于一个webveiw里面有许多加载操作,因此在调用webview.goback()方法时,往往达不到我们需要的操作效果. 1.解决方法 WebBackForwardList webBackForwardList=webview.copyBackForwardList()获取webview加载栈,然后更具加载栈做逻辑操作 2.webBackForwardList常用的方法 int size = webBackForwardList.getSize() webB

  • 关于Android WebView的loadData方法的注意事项分析

    loadData()中的html data中不能包含'#', '%', '\', '?'四中特殊字符,出现这种字符就会出现解析错误,显示找不到网页还有部分html代码.需要如何处理呢?我们需要用UrlEncoder编码为%23, %25, %27, %3f .可以使用以下两种代码,data为string类型的html代码1.webView.loadData(URLEncoder.encode(data, "utf-8"), "text/html",  "u

  • Android webview实现拍照的方法

    Android webview实现拍照的方法 1. html <div id="pnlVideo1"> <input type="hidden" name="imgNric1" id="imgNric1" /> <label id="nric" class="control-label labelfont" style="color:#888;fo

  • Android 解决WebView调用loadData()方法显示乱码的问题

    Android 解决WebView调用loadData()方法显示乱码的问题 第一步: mWebView.getSettings().setDefaultTextEncodingName("UTF-8"); 第二步: mWebView.loadData(data, "text/html; charset=UTF-8", null); WebView常用配置: private void initWebView() { mWebView.getSettings().se

  • Android webview和js互相调用实现方法

    Android-webview和js互相调用 Android 和 H5 都是移动开发应用的非常广泛.市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的.而H5具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以,App和H5页面相结合就显得尤为重要.而android和H5都不可能每次都是独立存在的,而是相互影响也相互的调用,获取信息等,例如,H5页面要获取App中的用户的基本信息,或者App端要操作H5

  • Android WebView使用方法详解 附js交互调用方法

    目前很多Android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优点: --可以直接显示和渲染web页面,直接显示网页 --webview可以直接用html文件(网络上或本地assets中)作布局 --和JavaScript交互调用 一.基本使用 首先layout中即为一个基本的简单控件: <WebView android:id="@+id/webView1

随机推荐