导航到与 webview 片段不同的片段后,如何在 webview 中返回?
Posted
技术标签:
【中文标题】导航到与 webview 片段不同的片段后,如何在 webview 中返回?【英文标题】:How do I go back within webview after navigation to a different fragment from the webview fragment? 【发布时间】:2016-10-24 23:07:44 【问题描述】:在离开WebView fragment
后,我一直在想办法回到WebView
。困境如下:
-
我加载了
WebView fragment
page1.html
然后我在其中导航到page1.html?navigate=page2.html
。
然后我在点击WebView fragment
中的某个事件时导航到不同的Fragment
,假设我点击了一个带入"NotAwebviewfragment.java"
的符号
然后我从notawebviewfragment
返回,然后它会将我带到我离开的WebView page
。但是,当我再次单击返回时,它会将我带到在 WebView
之前打开的上一个 Fragment
。
现在,如果我留在 WebViewFragment
内,我可以返回并返回
根据需要。但是,一旦我离开它,它就可以让我访问
WebView
只有一次。
到目前为止的代码如下: 在网络视图中:
public boolean webViewSteppedBack()
if (webview != null && webview.canGoBack())
webview.goBack();
return true;
return false;
public boolean backPressed(final MainActivity mainActivity)
if (webViewSteppedBack())
if(!EikonUtils.isTablet(getActivity()))
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
return true;
return false;
MainActivity
(包含返回的片段导航代码):
@Override
public void onBackPressed()
final FragmentManager manager = getSupportFragmentManager();
Fragment topFragment = FragmentStackManager.getInstance().getTopFragment();
if (backPressListener != null)
boolean b = false;
//Making sure we trigger the backPressed event if the listener is the top fragment
String bplTag = ((Fragment) backPressListener).getTag();
String topFragemtnTag = "";
if (topFragment != null)
topFragemtnTag = topFragment.getTag();
if (bplTag != null && topFragemtnTag != null && bplTag.equals(topFragemtnTag))
b = backPressListener.backPressed(this);
if (b) return;
if (!NotAWebViewFragment.TAG_NOT.equals(bplTag))
backPressListener = null;
【问题讨论】:
@CommonsWare 对此有何意见? 【参考方案1】:您需要在定义 webView 的片段中覆盖此方法。
webView.setOnKeyListener(new View.OnKeyListener()
@Override
public boolean onKey(View v, int keyCode, KeyEvent event)
if (event.getAction() == KeyEvent.ACTION_DOWN)
if (keyCode == KeyEvent.KEYCODE_BACK)
switch (keyCode)
case KeyEvent.KEYCODE_BACK:
if (mWebView.canGoBack())
mWebView.goBack();
return true;
return false;
);
【讨论】:
它给了我一个错误“方法没有从它的超类覆盖” 这似乎并没有让我回到 webview 的前一层,行为保持不变。我的问题是,即使它在 webview 中按预期来回移动,只要您通过单击 webview 中调用另一个片段的链接跳过包含 webview 的片段,就很难导航回之前的层网页浏览。假设片段 A 包含带有 google.com 的 webview,然后单击链接 google.com/somethingnew.html 然后在其中单击“单击此处调用本机片段”的内容,它转到片段,然后你点击返回并.. 它显示了 google.com/somethingnew.html 预期的前一个片段,但是当你再次点击返回时,它会转到包含 webview 的片段之前的上一个片段,而它应该能够在其中导航按下后退按钮时加载“google.com”的相同片段。现在一件有趣的事情是,如果我留在包含 webview 的片段中,只要我不跳出它到另一个片段,我就可以来回导航任意多个层。 你能否在 onKey 方法中放置一个调试器,并检查当你按下另一个片段的后退按钮时控件是否进入其中。 我在想,当你按下它时它不会进入 onKey 方法,因为当你从另一个片段 web 视图点击返回时,会丢失请求并且片段(包含 web 视图)获得焦点。因此,如果是这种情况,那么您需要在片段中实现 onBackPressed。【参考方案2】:您可以将所有片段添加到back stack。在activity的onBackPressed方法中,可以获取当前活动的fragment。您可以使用片段管理器的popBackStack() 方法检查活动片段是否是 Awebviewfragment 的实例,以及 webview 是否可以向后导航,否则会从堆栈中弹出当前活动片段。 这是代码sn-p: 1.添加片段
私人无效 addNotAwebviewfragment() supportFragmentManager.beginTransaction(); FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction(); notAwebviewfragment = NotAwebviewfragment.newInstance("test", "test");
fragmentTransaction.add(R.id.contents, notAwebviewfragment, NotAwebviewfragment.TAG_NOT).addToBackStack(NotAwebviewfragment.TAG_NOT);
fragmentTransaction.commit();
private void addFragWebview()
FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
webViewFragment = Awebviewfragment.newInstance("test", "test");
webViewFragment.setFragmentListener(weblistener);
backPressListener = webViewFragment;
fragmentTransaction.add(R.id.contents, webViewFragment, Awebviewfragment.TAG).addToBackStack(Awebviewfragment.TAG);
fragmentTransaction.commit();
在主要活动的 onBackPRessed() 中: @覆盖 公共无效 onBackPressed()
Fragment fragment = getActiveFragment();
if(fragment instanceof Awebviewfragment)
System.out.println("web view fragment");
if(backPressListener != null && backPressListener.backPressed(this))
System.out.println("web view fragment will return");
return;
int count = supportFragmentManager.getBackStackEntryCount();
if (count > 0 )
supportFragmentManager.popBackStackImmediate();
else
super.onBackPressed();
获取活动片段:
公共片段 getActiveFragment()
if (supportFragmentManager.getBackStackEntryCount() == 0)
返回空值;
字符串标签 = supportFragmentManager.getBackStackEntryAt(supportFragmentManager.getBackStackEntryCount() - 1).getName();
返回 supportFragmentManager.findFragmentByTag(tag);
您可以查看github 中提交的示例。
【讨论】:
以上是关于导航到与 webview 片段不同的片段后,如何在 webview 中返回?的主要内容,如果未能解决你的问题,请参考以下文章