【问题标题】:How to set onBackPress in Fragment on Android如何在 Android 上的 Fragment 中设置 onBackPress
【发布时间】:2017-09-12 13:57:54
【问题描述】:

在我的应用程序中,我使用ViewPager 在活动中显示两个fragments
在其中一个fragments 中,我使用NavigationDrawer,我希望在单击onBackPress 时关闭此NavigationDrawer

我为打开这个抽屉写了下面的代码:

reviewSerialFrag_DrawerLayout.openDrawer(Gravity.END);

我想在点击 onBackPress 关闭此抽屉时使用以下代码:

reviewSerialFrag_DrawerLayout.closeDrawer(Gravity.END);

我该怎么办?请帮帮我

【问题讨论】:

    标签: android android-fragments navigation-drawer


    【解决方案1】:
    /Try to use below code snipet/
    
      @Override
      public void onBackPressed()
      {
    
    int count = getFragmentManager().getBackStackEntryCount();
    
    // count --> Is your current fragment 
    
    if (count == 0) 
    {
        if(reviewSerialFrag_DrawerLayout.isDrawerVisible(GravityCompat.END))
        {
            reviewSerialFrag_DrawerLayout.closeDrawer(GravityCompat.END);
        }
    
    } 
    
    
    }
    

    【讨论】:

    • 谢谢,但我们不能在片段中使用public void onBackPressed() 方法我的兄弟
    • 我不能使用 @Override public void onBackPressed() 。 :(
    • @YoYoAnimate 不需要在 Fragment 中使用 onBackPressed 在 Activity 中使用它并检查片段计数。如果计数是您的导航抽屉片段,则检查导航抽屉是否打开。如果打开关闭它..
    【解决方案2】:

    在你的ActivityonBackPressed()写下面的代码

    @Overrdie
    public void onBackPressed(){
    Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
    
       if(currentFragment instanceof YourDrawerFragment && reviewSerialFrag_DrawerLayout.isDrawerVisible(GravityCompat.END))
            {
                reviewSerialFrag_DrawerLayout.closeDrawer(GravityCompat.END);
                return;
            }
        super.onBackPresses():
    }
    

    【讨论】:

    • 你能把你的 Skype ID 发给我吗?请
    • 我不用skype,你可以在这里提一下
    【解决方案3】:

    您可以这样做以在后按时关闭您的抽屉

    @Overrdie
    public void onBackPressed(){
    super.onBackPresses():
    if(reviewSerialFrag_DrawerLayout.isDrawerVisible(GravityCompat.END)){
            reviewSerialFrag_DrawerLayout.closeDrawer(GravityCompat.END);
     }
    }
    

    【讨论】:

      【解决方案4】:

      一般来说,我发现使用观察者模式和委托将后按事件向下传递给片段是最简单的。这将允许您将活动和片段关注点分开。

      interface OnBackPressedListener {
        public void onBackPressed();
      }
      

      然后,在你的片段中,实现这个OnBackPressedListener

      class MyFragment extends Fragment implements OnBackPressedListener{
      
        public void onBackPressed(){...}
      
      }
      

      最后,在您的活动中,您可以执行以下操作:

      class MyActivity extends Activity {
        @Override
        public void onBackPressed(){
      
          // Grab all the fragments that are 'observing' the back press event
          Fragment currentFragment =
            getFragmentManager().findFragmentById(R.id.fragment_container);
      
          if(currentFragment != null && currentFragment instanceof OnBackPressedListener) {
            // delegate this back press event down to the fragment
            OnBackPressedListener backFragment = (OnBackPressedListener) currentFragment;
            backFragment.onBackPressed();
          }
      
          super.onBackPressed():
      }
      

      【讨论】:

      • 谢谢,但找不到 R.id.fragment_containerR.id.fragment_container 是什么?
      • 这是托管片段的容器的 id。这只是一个示例,因此您的 id 可能不同。
      • @嘿,我的朋友,你能把你的 Skype ID 发给我吗?请
      • 对不起,我不使用 Skype。如果你有一个具体的问题,你应该在这里问。如果我们能找到答案,我相信我们的讨论会在未来帮助其他人。
      【解决方案5】:

      在 Jon 的解决方案中,将始终调用 super.onBackPressed。情况可能不一定如此。 为此,实现返回一个布尔值并根据结果进行操作就足够了。

      我的解决方案几乎相同here

      public interface IOnBackPressed {
          /**
           * Si vous retouné true le back press ne sera pas pris en compte, sinon l'activité agira naturellement
           * @return true si votre traitement est prioritaire sinon false
           */
          boolean onBackPressed();
      }
      

      查看more details的链接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        • 2014-02-19
        • 2019-03-05
        相关资源
        最近更新 更多