Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android WebView使用与后退键

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

作者:志尊宝

在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使用与后退键内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文