Android WebView的使用与后退键处理详细讨论

 更新时间:2024年04月09日 09:36:32   作者:志尊宝  
在android开发中我们有时候根据项目的需求多少会加载一些webview,加载webview,我们有时候会根据UI来自定义返回键,下面这篇文章主要给大家介绍了关于Android WebView的使用与后退键处理的相关资料,需要的朋友可以参考下

前言

webView是Android中常用的组件之一,用于展示网页内容。它可以加载HTML文件、URL链接等网页内容,并提供交互功能。在使用webView时,我们经常会涉及到后退键处理,下面让我们详细讨论一下webView的使用和后退键处理。

首先,我们需要在布局文件中添加webView组件

<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>

在Activity中获取webView实例,并加载网页内容

WebView webView = findViewById(R.id.webView);
webView.loadUrl("http://www.example.com");

以上代码中,我们获取了布局文件中的webView组件,并使用loadUrl()方法加载了指定的URL链接。如果要加载本地的HTML文件,可以使用loadUrl(“file:///android_asset/your_file.html”)方法。

当webView加载网页时,我们可能需要处理一些事件,比如点击链接时打开新网页、后退键按下时返回上一页等。下面我们来详细讨论一下后退键处理。

首先,在Activity中重写onKeyDown()方法,用于监听后退键的按下事件:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
        //处理后退键事件
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

在上述代码中,我们判断了按下的键是否为后退键,并且事件的动作是否为按下(ACTION_DOWN)。如果条件成立,则表示后退键被按下,我们可以在条件成立的地方添加我们的后退逻辑。

在webView中,我们可以使用goBack()方法来返回上一页。所以,在后退键按下时,我们可以调用webView的goBack()方法来实现返回上一页的功能。具体代码如下:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
        if (webView.canGoBack()) {
            //如果webView可以返回上一页,则调用goBack()方法返回上一页
            webView.goBack();
        } else {
            //否则,执行其他逻辑(比如退出Activity)
            finish();
        }
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

在上述代码中,我们添加了一个判断语句,判断webView是否可以返回上一页。如果可以,则调用webView的goBack()方法返回上一页。如果不可以,则执行其他逻辑(比如退出Activity)。

另外,我们还可以通过监听webView的历史记录来判断是否可以返回上一页。webView提供了一个WebViewClient类,该类中有一个shouldOverrideUrlLoading()方法,可以用于监听webView的url加载事件。我们可以通过重写该方法,并在方法中判断webView的历史记录来判断是否可以返回上一页。具体代码如下:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (webView.canGoBack()) {
            //如果webView可以返回上一页,则调用goBack()方法返回上一页
            webView.goBack();
        } else {
            //否则,执行其他逻辑(比如退出Activity)
            finish();
        }
        return true;
    }
});

在上述代码中,我们通过webView的setWebViewClient()方法设置了一个新的WebViewClient实例,并重写了其shouldOverrideUrlLoading()方法。在方法中,我们判断了webView是否可以返回上一页,如果可以,则调用goBack()方法返回上一页。如果不可以,则执行其他逻辑(比如退出Activity)。

除了上述的代码实现方式,我们还可以通过webView的WebChromeClient类来监听后退键的按下事件。WebChromeClient类有一个onKeyDown()方法,可以用于监听键盘按键的按下事件。具体代码如下:

webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
            if (webView.canGoBack()) {
                //如果webView可以返回上一页,则调用goBack()方法返回上一页
                webView.goBack();
            } else {
                //否则,执行其他逻辑(比如退出Activity)
                finish();
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
});

在上述代码中,我们通过webView的setWebChromeClient()方法设置了一个新的WebChromeClient实例,并重写了其onKeyDown()方法。在方法中,我们判断了按下的键是否为后退键,并且事件的动作是否为按下(ACTION_DOWN)。如果条件成立,则表示后退键被按下,我们可以在条件成立的地方添加我们的后退逻辑。

以上就是webView的使用和后退键处理的详细讨论。对于webView的使用,我们可以通过loadUrl()方法加载网页内容,还可以监听webView的各种事件来实现特定的功能。而对于后退键处理,我们可以重写Activity的onKeyDown()方法,通过判断后退键的按下事件来实现返回上一页的功能。同时,我们还可以通过监听webView的历史记录或使用WebChromeClient来实现后退键的处理。

附:Android 开发之webview页面返回到最顶关闭

public class MyWebViewActivity extends Activity {
     private Context context = this;
     // 底部菜单View
     // public static View bottomView;
     private WebViewProgressBar webView;
     private String url;
     private HtmlBean bean;
     // 手势
     private GestureDetector mGestureDetector;
     private TextView btn_goback;
     String title;
     @Override
 protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      requestWindowFeature(Window.FEATURE_NO_TITLE);
      setContentView(R.layout.usershop_layout);
      MyUtils.checkStrictMode(true);
  
      url = getIntent().getStringExtra("url");
      if (!TextUtils.isEmpty(title)) {
           TextView tv_title = (TextView) findViewById(R.id.title_text);
           if (title.length() > 6) {
                title = title.substring(0, 6);
           }
       tv_title.setText(title);
      }
      if (TextUtils.isEmpty(url)) {
           Toast.makeText(this, "没有找到相关的链接地址", Toast.LENGTH_LONG).show();
           return;
      }
 
  initWebView();
  this.initJsInterface();
  initGestureDetector();
 }
 
 // 初始化webView
 private void initWebView() {
  // 底部菜单
//  bottomView = findViewById(R.id.user_bottom);
  btn_goback=(TextView)findViewById(R.id.btn_goback);
  // WebView
  webView = (WebViewProgressBar) findViewById(R.id.user_webview);
  // 滚动条
  webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
  // 脚本支持
  webView.getSettings().setJavaScriptEnabled(true);
  // 缩放
  webView.getSettings().setSupportZoom(true);
  webView.loadUrl(url);
 
  // WebView客户端
  webView.setWebViewClient(new WebViewClient() {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String nextUrl) {
    // 下一个链接
    try {
     if(title.equals("个人中心")){
      url=nextUrl;
     }
    } catch (Exception e) {
    }
    view.loadUrl(nextUrl);
    return true;
   }
 
   // 开始加载
   @Override
   public void onPageStarted(WebView view, String url2, Bitmap favicon) {
    // TODO Auto-generated method stub
   }
 
   // 加载完毕
   @Override
   public void onPageFinished(WebView view, String url2) {
   }
  });
  btn_goback.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    finish();
   }
  });
  // WebView的滑动事件交个手势处理
  webView.setOnTouchListener(new OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    return mGestureDetector.onTouchEvent(event);
   }
  });
 }
 
 // 初始化手势
 private void initGestureDetector() {
  mGestureDetector = new GestureDetector(this, new OnGestureListener() {
   @Override
   public boolean onSingleTapUp(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
   }
 
   @Override
   public void onShowPress(MotionEvent e) {
    // TODO Auto-generated method stub
 
   }
 
   @Override
   public boolean onScroll(MotionEvent e1, MotionEvent e2,
     float distanceX, float distanceY) {
    // TODO Auto-generated method stub
    return false;
   }
 
   @Override
   public void onLongPress(MotionEvent e) {
    // TODO Auto-generated method stub
 
   }
 
   @Override
   public boolean onFling(MotionEvent e1, MotionEvent e2,
     float velocityX, float velocityY) {
 
    return false;
   }
 
   @Override
   public boolean onDown(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
   }
  }, new Handler() {
 
  });
 
 }
 
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  ShareDao.onActivityResult(requestCode, resultCode, data);
  super.onActivityResult(requestCode, resultCode, data);
 
 }
 
 public void btn_on(View view){
  if(webView.canGoBack()){
   webView.goBack(); // goBack()表示返回WebV
  }else {
   finish();
  }
 }
 
 }
}

总结

到此这篇关于Android WebView的使用与后退键处理的文章就介绍到这了,更多相关Android WebView使用与后退键内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android利用Gson解析嵌套多层的Json的简单方法

    Android利用Gson解析嵌套多层的Json的简单方法

    下面小编就为大家带来一篇Android利用Gson解析嵌套多层的Json的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Kotlin与Java相互调用的完整实例

    Kotlin与Java相互调用的完整实例

    Kotlin的设计过程中就考虑到了与Java的互操作性,在Kotlin中可以直接调用既有的Java代码,反过来在Java中也可以很流畅地使用Kotlin代码,这篇文章主要给大家介绍了关于Kotlin与Java相互调用的相关资料,需要的朋友可以参考下
    2021-12-12
  • android开发教程之listview显示sqlite数据

    android开发教程之listview显示sqlite数据

    这篇文章主要介绍了android使用listview显示sqlite数据的方法,需要的朋友可以参考下
    2014-03-03
  • 在Android里完美实现基站和WIFI定位

    在Android里完美实现基站和WIFI定位

    众所周知的,在OPhone和大部分国产的Android定制机里不支持最简单实用的基站和WIFI定位,只能使用速度慢而耗电的GPS定位,但OPhone和华为/中兴生产的一些Android定制机却占据了一定的市场,因此导致了很多使用了定位技术的Andorid应用挺尴尬的。
    2014-07-07
  • Android仿百度福袋红包界面

    Android仿百度福袋红包界面

    过年了,红包来袭,红包是怎么来的大家知道吗?这篇文章主要介绍了Android仿百度福袋红包界面,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • 分别用ToolBar和自定义导航栏实现沉浸式状态栏

    分别用ToolBar和自定义导航栏实现沉浸式状态栏

    本文主要介绍了分别用ToolBar和自定义导航栏实现沉浸式状态栏的方法步骤,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • android滑动解锁震动效果的开启和取消

    android滑动解锁震动效果的开启和取消

    在4.0的圆环滑动解锁中,我们点击下去的时候会有震动效果,因为这个控件设置的震动效果没有绑定设置中设置的触摸振动开关来取消振动效果,下边这个例子实现了开启和取消的方法
    2013-06-06
  • Android控件RecyclerView实现混排效果仿网易云音乐

    Android控件RecyclerView实现混排效果仿网易云音乐

    这篇文章主要为大家详细介绍了Android控件RecyclerView实现混排效果,仿网易云音乐,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Android中AsyncTask异步任务使用详细实例(一)

    Android中AsyncTask异步任务使用详细实例(一)

    AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程,通过本文给大家介绍Android中AsyncTask异步任务使用详细实例(一),需要的朋友参考下
    2016-02-02
  • Android编程实现通话录音功能的方法

    Android编程实现通话录音功能的方法

    这篇文章主要介绍了Android编程实现通话录音功能的方法,结合实例形式较为详细的分析了Android广播接收机制实现录音功能的操作技巧,需要的朋友可以参考下
    2017-06-06

最新评论