如何在WebView里添加“返回”function在Fragment里面?

更新:解决! 问题与我的Viewpager而不是WebView有关。

我想添加一个“返回”function,我的WebView里面的Fragment 。 但我不知道如何:

 public final class TestFragment extends Fragment { static WebView mWeb; private View mContentView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContentView = inflater.inflate(R.layout.webview, null); mWeb = (WebView)mContentView.findViewById(R.id.webview); WebSettings settings = mWeb.getSettings(); settings.setJavaScriptEnabled(true); settings.setSupportZoom(false); mWeb.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); mWeb.getSettings().setBuiltInZoomControls(false); mWeb.loadUrl("myurl..."); mWeb.setOnKeyListener(new OnKeyListener(){ public boolean onKey(View v, int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWeb.canGoBack()) { mWeb.goBack(); return true; } return false; } }); } } 

我也试过类似的东西:

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

另一个解决scheme,但同样的问题

 @Override public void onBackPressed() { if(webView.canGoBack()) webView.goBack(); else super.onBackPressed(); } 

任何想法如何得到这个工作?

  • 支持HTML5的最佳WebView设置?
  • Android:如何在使用webview.loadUrl时检查url的成功加载
  • 如何在webview中加载html字符串?
  • 如何在webview中清除cookie上的cookie和caching的web浏览器?
  • 在Android应用内embeddedYoutubevideo
  • 使用Javascript在WebView中填写表单
  • Android webview,在assets文件夹中加载javascript文件
  • 无法在Android Web View中查看video
  • 也许它的android限制。 尝试使用处理程序执行此操作。

     public final class TestFragment extends Fragment { static WebView mWeb; private View mContentView; private Handler handler = new Handler(){ @Override public void handleMessage(Message message) { switch (message.what) { case 1:{ webViewGoBack(); }break; } } }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { mContentView = inflater.inflate(R.layout.webview, null); mWeb = (WebView)mContentView.findViewById(R.id.webview); WebSettings settings = mWeb.getSettings(); settings.setJavaScriptEnabled(true); settings.setSupportZoom(false); mWeb.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); mWeb.getSettings().setBuiltInZoomControls(false); mWeb.loadUrl("myurl..."); mWeb.setOnKeyListener(new OnKeyListener(){ public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_UP && mWeb.canGoBack()) { handler.sendEmptyMessage(1); return true; } return false; } }); } private void webViewGoBack(){ mWeb.goBack(); } } 

    其实你不能直接在片段内。 onBackPressed可以在FragmentActivity重写。 你可以做的是:

    1. 覆盖活动内部的onBackPressed
    2. 调用onBackPressed ,检查当前片段的实例是否显示webview的实例。
    3. 如果是这样,请问这个fragment如果webview可以返回。
    4. 如果不是,请致电super或任何您需要的

    编辑:

      @Override public void onBackPressed() { Fragment webview = getSupportFragmentManager().findFragmentByTag("webview"); if (webview instanceof MyWebViewFragment) { boolean goback = ((MyWebViewFragment)webview).canGoBack(); if (!goback) super.onBackPressed(); } } 

    WebViewActivity.java ,我添加了1个方法:

     @Override public void onBackPressed() { WebViewFragment fragment = (WebViewFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainer); if (fragment.canGoBack()) { fragment.goBack(); } else { super.onBackPressed(); } } 

    WebViewFragment.java ,我添加了2个方法:

     public boolean canGoBack() { return mWebView.canGoBack(); } public void goBack() { mWebView.goBack(); } 

    我的解决scheme是在我添加到公共方法的片段

     public static boolean canGoBack(){ return mWebView.canGoBack(); } public static void goBack(){ mWebView.goBack(); } 

    然后从我打电话的活动

     @Override public void onBackPressed() { if(webFragment.canGoBack()){ webFragment.goBack(); }else{ super.onBackPressed(); } } 

    注意mwebview是静态的

    你可以这样做:

    • Activity放:

       // Set WebView public void setWebView(WebView web) { this.web = web; } 
    • ActivityCreated() put之后的web片段中:

      ((Your_Activity) getActivity()).setWebView(webView);

    • 不要忘记像这样从onCreateView()设置webView

       @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { webView = (WebView) inflater.inflate(R.layout.your_web_fragment, container, false); return web; } 

    @OmidAmnivia的答案是正确的你的应用程序崩溃的解决scheme是

     @Override public void onBackPressed() { if(webFragment.isInitialized && webFragment.canGoBack()){ webFragment.goBack(); }else{ super.onBackPressed(); } } 

    你必须检查你的class级是否已经初始化。

    @ RomanBlack的回答给了我正确的想法,但是因为我们使用kotlin,所以我必须稍微调整一下答案。

     webView.setOnKeyListener { _, _, keyEvent -> if (keyEvent.keyCode == KeyEvent.KEYCODE_BACK && !webView.canGoBack()) { false } else if (keyEvent.keyCode == KeyEvent.KEYCODE_BACK && keyEvent.action == MotionEvent.ACTION_UP) { webView.goBack() true } else true } 

    如果你想用回报来做,你必须添加如下内容:

     return@setOnKeyListener true 

    你可以检查这个代码:

      webView.canGoBack(); webView.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_UP && webView.canGoBack()) { webView.goBack(); return true; } return false; } }); 

    首先回到片段

      mContentView.setFocusableInTouchMode(true); mContentView.requestFocus(); mContentView.setOnKeyListener( new OnKeyListener() { @Override public boolean onKey( View v, int keyCode, KeyEvent event ) { if( keyCode == KeyEvent.KEYCODE_BACK ) { if (mWebView.canGoBack()) { mWebView.goBack(); retune false; } else { return true; } } return false; } } ); 

    希望它会起作用。