【问题标题】:Close bottom sheet inside fragment from activity从活动中关闭片段内的底部工作表
【发布时间】:2019-07-20 11:25:09
【问题描述】:

我有一个查看器,里面有 3 个片段。如果我点击 recyclerview 项目,在片段内部我有一个 recyclerview,它会显示底部表,其中包含该项目的一些详细信息。但是当我点击后退按钮时,它会关闭应用程序。如果我点击后退按钮,我怎样才能实现它会关闭底部工作表,然后关闭应用程序。我可以关闭底页。但是在片段内部没有 onBackPressed 方法所以我不能。任何帮助表示赞赏。

【问题讨论】:

    标签: android android-activity android-viewpager fragment bottom-sheet


    【解决方案1】:

    还有更多的一种方法可以实现这一点,但我想这一切都归结为:

    注意:由于没有代码,我怀疑底部工作表在您的片段内。

    您必须将BottomSheetCallback 设置为您拥有它的片段:

    BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View view, int newState) {
            switch (newState) {
                case BottomSheetBehavior.STATE_EXPANDED: {
                    // sheet expanded
                }
                break;
                case BottomSheetBehavior.STATE_COLLAPSED: {
                    // sheet collapsed
                }
                break;
            }
        }
    
        @Override
        public void onSlide(@NonNull View view, float v) {
    
        }
    });
    

    然后有一个像 isSheetExpanded 这样的全局布尔值并将其设置为 onStateChanged。 (展开时 = true,折叠时 = false)

    您的 PagerAdapter 需要注意这个变量,例如:

    boolean sheetVisible = pagerAdapter.get(fragment).isSheetExpanded;
    

    最后,持有 ViewPager 的 Activity 的 onBackPressed() 你应该这样做:

      @Override
        public void onBackPressed() {
            if (sheetVisible) {
                // collapse bottom sheet
            } else {
                super.onBackPressed();
            }
       }
    

    无需任何代码,这应该足以为您指明正确的方向。

    祝你好运!

    【讨论】:

      【解决方案2】:

      你的片段

      override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              requireActivity().onBackPressedDispatcher.addCallback(
                  this,
                  object : OnBackPressedCallback(true) {
                      override fun handleOnBackPressed() {
                          when (bottomSheetBehavior.state) {
                              BottomSheetBehavior.STATE_HALF_EXPANDED -> {
                                  closeBottomSheetFragment()
                              }
                              else -> {
                                  isEnabled = false
                                  requireActivity().onBackPressed()
                              }
                          }
                      }
                  })
          }
      

      【讨论】:

        猜你喜欢
        • 2019-07-02
        • 2020-02-28
        • 2020-04-28
        • 1970-01-01
        • 2020-08-10
        • 1970-01-01
        • 1970-01-01
        • 2020-10-06
        • 2021-11-28
        相关资源
        最近更新 更多