如何在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(); }
任何想法如何得到这个工作?
也许它的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
重写。 你可以做的是:
- 覆盖活动内部的
onBackPressed
。 - 调用
onBackPressed
,检查当前片段的实例是否显示webview
的实例。 - 如果是这样,请问这个
fragment
如果webview
可以返回。 - 如果不是,请致电
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
首先回到片段
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; } } );
希望它会起作用。