在Fragment中重写返回键以让WebView使用返回功能

来源:互联网 发布:高中女神 体验知乎 编辑:程序博客网 时间:2024/06/13 13:34

首先我是实现一个PagerView的页面滑动效果,并在里面添加了两个Fragment当作子页面。其中一个Fragment中使用WebView显示网页。

于是遇到了这样的问题: 

1、使用网页的时候,从一个页面跳到另一个页面,当想返回上一个页面时,点击返回按钮,应用直接就退出了。

2、解决问题1之后,WebView加载了一个重定向的页面,点击返回按钮页面无法正常返回,多次点击才能返回。

问题1:

         其实就是重写onKeyDown 方法,但是Fragment类没有onKeyDown方法,怎么办呢,就在MainActivity中重写。

         如下:

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1.        @Override  
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  3.     // TODO Auto-generated method stub  
  4.     if(currentIndex==1){  
  5.         WebFragment.clickBack(keyCode, event);  
  6.         return true;  
  7.     }  
  8.     return super.onKeyDown(keyCode, event);  
  9. }  
        @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        // TODO Auto-generated method stub        if(currentIndex==1){            WebFragment.clickBack(keyCode, event);            return true;        }        return super.onKeyDown(keyCode, event);    }
         可以看到,在MainActivity的onKeyDown方法中,当页面处在有WebView的页面时(currentIndext==1),我调用了WebFragment的clickBack方法并传递keyCode和event两个参数。

        是的,我在WebFragment中添加了一个静态方法clickBack,接收MainActivity传来的keyCode和event参数,这样就可以自定义onKeyDown方法了。如下:

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1.     public static boolean clickBack(int keycode,KeyEvent event){  
  2. if(keycode==KeyEvent.KEYCODE_BACK&&webView.canGoBack()){  
  3.     webView.goBack();  
  4. }  
  5. return true;  
      public static boolean clickBack(int keycode,KeyEvent event){        if(keycode==KeyEvent.KEYCODE_BACK&&webView.canGoBack()){            webView.goBack();        }        return true;    }
        这样当用户点击返回按钮时,WebView的页面就会goBack了。

  

问题2:

       只要重写WebViewClient里面的shouldOverrideUrlLoading方法即可,如下:

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1.               @Override  
  2. public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  3.     // TODO Auto-generated method stub  
  4.     return false;  
  5. }  
                @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            // TODO Auto-generated method stub            return false;        }
      是的,就这么简单,只要返回false就行了。我也不知道为什么,这是从别人那里看来的。


      注:以上的方法是我进行了大量搜索之后查到的最简单的解决办法,可能不是最好的解决办法,网络上也还有其他许多针对这两个问题的解决办法。




0 0