导航到与 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 中返回?的主要内容,如果未能解决你的问题,请参考以下文章

导航到Android中的另一个片段后如何清除导航堆栈

如何将不同的参数传递给片段 [导航] Android

第一个片段替换为第二个片段后,如何打开导航抽屉

更改片段后如何取消显示堆叠的吐司?

如何在导航抽屉中的两个片段之间传递数据

Android - 恢复 Fragment WebView 状态以避免重新加载