首页 > 其他分享 >Android webview实战

Android webview实战

时间:2022-11-22 11:37:34浏览次数:36  
标签:实战 layout url void private public Android webview android


今天来使用webview进行一个实例演练,可以基本用到任何地方,目的在于熟悉一下webview的使用,基本算是入门的吧。

先看一下效果图,

Android webview实战_webview


接下来我们看看如何实现

第一步:
首先加载网页的时候有个对话框,我们看看怎么实现的,

public class CustomDialog extends Dialog {
private LayoutInflater inflater;
public CustomDialog(Context context) {
super(context);
inflater = LayoutInflater.from(context);
initView();
}
/**
* 给对话框填充布局
*/
private void initView() {
View view = inflater.inflate(R.layout.dialog_layout, null);
setContentView(view);
}

/**
* 显示对话框
*/
public void showDialog(){
show();
}
}

然后在页面加载失败的时候,我们需要去显示一个自定义的错误页面

Android webview实战_android_02


布局文件如下

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/online_error_btn_retry"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#E6E6E6"
android:clickable="true"
android:gravity="center" >


<TextView
android:id="@+id/img_error"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:text="加载数据失败,请检查你的网络"
android:textColor="#9e9e9e"
android:textSize="16.0sp" />

<Button
android:id="@+id/error_btn_refresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/img_error"
android:layout_centerHorizontal="true"
android:layout_marginTop="15dp"
android:gravity="center"
android:singleLine="true"
android:text="重新加载"
android:textColor="#9e9e9e" />

</RelativeLayout>

最后给出java代码,由于注释比较详细,就不慢慢讲了

public class WebViewActivity extends AppCompatActivity {
private WebView webView;
private boolean isErrorPage = false;
private View mErrorView;
private CustomDialog dialog;
private String curretnUrl = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
webView = (WebView) findViewById(R.id.webview);
curretnUrl = getIntent().getStringExtra("curretnUrl");//获取跳转过来的url
initView();
}
private void initView() {
dialog = new CustomDialog(this);
webView.setWebViewClient(new WebViewClient(){
//重写此方法,自定义错误页面
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
isErrorPage = true;
showErrorPage();
}
/**
*
* @param view 初始化回调的webview
* @param url 需要加载的url
* @return true表示url是根据程序执行的,false表示url是在webview内部执行的
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//此处如果返回true,只有在点击重新加载按钮时才会加载url
//如果返回false,第一次进来加载时就会加载此url
webView.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
if(mErrorView!=null){
if(isErrorPage){
mErrorView.setVisibility(View.VISIBLE);
}
}
}
});
webView.loadUrl(curretnUrl);
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
if(newProgress>=90){
if(dialog!=null&&dialog.isShowing()){
dialog.dismiss();
if(mErrorView!=null){
if(isErrorPage){
mErrorView.setVisibility(View.VISIBLE);
}else{
mErrorView.setVisibility(View.GONE);
}
}
}
}
}
});
dialog.showDialog();
}

/**
* 显示自定义的错误页面
*/
private void showErrorPage() {
initErrorPage();
LinearLayout webParent = (LinearLayout) webView.getParent();
//移除LinearLayout上面的其他页面,只剩一个webview用于添加错误页面
while(webParent.getChildCount() >1){
webParent.removeViewAt(0);
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
//将错误页面添加到webview中
webParent.addView(mErrorView,0,params);
}
private void initErrorPage() {
if(mErrorView == null){
//初始化错误页面
mErrorView = View.inflate(this,R.layout.activity_url_error,null);
Button btn_reload = (Button) mErrorView.findViewById(R.id.error_btn_refresh);
//点击按钮重新加载
btn_reload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//重新加载
webView.reload();
if(dialog!=null){
dialog.showDialog();
isErrorPage = false;
}
}
});
}
}
}


标签:实战,layout,url,void,private,public,Android,webview,android
From: https://blog.51cto.com/u_10847930/5877245

相关文章

  • 从setContentView分析Android加载布局的流程
    一.概述在Activity中,我们基本都会用到setContentView方法,这个方法是干啥的想必大家都知道,把我们写好的布局文件显示到界面上。今天我们就去看看底层的源码,分析一下到底是如......
  • 从源码的角度理解Android消息处理机制
    总结与Handler共同作用的有Looper,MessageQueue,Message。我么接下来从源码的角度看看整个过程的大概实现。首先说一下每个对象的作用:Looper:消息轮询循器,不断的从消息队......
  • Android命令行查看内存情况
    在学习如何查看内存前先来介绍几个概念VSS-VirtualSetSize虚拟耗用内存(包含共享库占用的内存)RSS-ResidentSetSize实际使用物理内存(包含共享库占用的内存)PSS......
  • Android实现3D页面加载进度条动画
    一.概述最近在研究公司的代码,发现每次切换页面时做的进度条效果还挺不错的,所以想深入研究一下,今天就带大家来看看到底是如何实现的,首先上效果图二.实现上面的进度条最大的......
  • Android使用MAT分析内存泄露
    一.概述首先来普及一下什么是内存泄露:内存泄露是指对象的内存在分配之后无法通过程序的执行逻辑释放对该对象的引用,导致不能回收该对象所占内存。内存泄露会导致以下情......
  • Android网络类型判断
    在Android开发中,我们有时候需要根据当前网络的类型去做一些操作,下面看看如何判断当前网络的状况:publicclassNetWorkUtil{privatestaticConnectivityManagermanage......
  • Golang学习日志 ━━ 理解依赖包的管理(mod/非mod)和加载方式(项目路径、相对路径、绝对
    go有很多种方法调用依赖包,mod又加入了对包的版本管理。方式太多不免有令人迷惑和混乱的地方,希望本文能帮助大家了解目前使用规则一、mod/非mod管理方式go提供了两种项目......
  • Unity :Android局域网通信、UDP广播实现控制器开关(继电器)
    要解决的问题:1.UDP广播:因为平板控制的不仅仅是继电器,还有其他电脑2.继电器接收的是16进制指令,所以要把12个按钮1-12转换成16进制,要不然一个个的发送太麻烦,这里是指令的理......
  • [Android开发学iOS系列] TableView展现一个list
    TableView基础本文讲讲TableView的基本使用.顺便介绍一下delegation.TableView用来做什么TableView用来展示一个很长的list.和Android中的RecyclerView不同,iOS中的......
  • python flask实战订餐系统微信小程序-59flask部署单进程启动服务
    欢迎关注原创Python微信订餐小程序课程视频Python实战量化交易理财系统​​python​​​​flask​​实战订餐系统微信小程序-60nginx+uwsgi实现多进程访问​​​B站配套......