【问题标题】:Hide TabLayout and Toolbar in some Fragments / Handling onPause/onResume correctly在某些 Fragments 中隐藏 TabLayout 和 Toolbar / 正确处理 onPause/onResume
【发布时间】:2020-02-05 04:23:38
【问题描述】:

我正在使用带有导航图的单一活动方法。 我不希望我的选项卡布局或工具栏在某些片段中可见。我写了一个超类来扩展那些我不想要酒吧的片段。但不知何故,我无法正确理解生命周期,因为这不起作用:

 public class NoTabLayoutFragment extends Fragment {

    @Override
    public void onResume() {
        super.onResume();
        hideTabLayout();

    }

    @Override
    public void onPause() {
        super.onPause();
        showTabLayout();
    }

    private void showTabLayout() {
        if (getActivity() != null && getActivity().findViewById(R.id.fragment_main_tab_layout) != null) {
            getActivity().findViewById(R.id.fragment_main_tab_layout).setVisibility(View.VISIBLE);
        }

    }

    private void hideTabLayout() {
        if (getActivity() != null && getActivity().findViewById(R.id.fragment_main_tab_layout) != null) {
            getActivity().findViewById(R.id.fragment_main_tab_layout).setVisibility(View.GONE);
        }

    }
}  

public class NoBarsFragment extends NoTabLayoutFragment {
    @Override
    public void onResume() {
        super.onResume();
        hideToolbar();
    }

    @Override
    public void onPause() {
        super.onPause();
        showToolbar();
    }

    private void hideToolbar() {
        if (getActivity() != null && ((AppCompatActivity) getActivity()).getSupportActionBar() != null) {
            ((AppCompatActivity) getActivity()).getSupportActionBar().hide();
        }
    }

    private void showToolbar() {
        if (getActivity() != null && ((AppCompatActivity) getActivity()).getSupportActionBar() != null) {
            ((AppCompatActivity) getActivity()).getSupportActionBar().show();
        }
    }
}

我做错了什么?

【问题讨论】:

    标签: android toolbar android-tablayout lifecycle


    【解决方案1】:

    根据Listen for Navigation Events documentation,更改UI 可见性的正确方法是通过OnDestinationChangedListener

    navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller,
               @NonNull NavDestination destination, @Nullable Bundle arguments) {
           if(destination.getId() == R.id.full_screen_destination) {
               getSupportActionBar().hide()
           } else {
               getSupportActionBar().show()
           }
       }
    });
    

    【讨论】:

    • 如果您想要一种无需对活动逻辑中的所有 ID 进行硬编码的技术,您也可以查看 argument based listener
    • 嗨@ianhanniballake,我来自另一个你标记为重复的问题,这解决了我隐藏我的应用栏的问题,但是我有一点,从一个片段过渡到我需要隐藏我的应用栏的那个,这不是我目前所期望的,这是这个库的正常行为吗?因为它折叠起来消失,就像过渡一样,还有,有没有办法将我在那个片段中的工具栏设置为新的应用栏,这样我就可以将 homeNavigation 箭头放在那个工具栏上。谢谢
    • 我不能在我的新片段中使用(requireActivity() as AppCompatActivity).setSupportActionBar(toolbar) 来设置该工具栏,因为我收到了这个错误这个活动已经有一个由窗口装饰提供的操作栏。不要在主题中请求 Window.FEATURE_SUPPORT_ACTION_BAR 并将 windowActionBar 设置为 false 以使用工具栏。 @ianhanniballake
    • @CoffeeBreak - 这里的代码不会调用setSupportActionBar(),除非您使用NoActionBar 主题,否则也不是必需的。
    • 但在这种情况下,如果我使用 NoActionBar 主题,我需要将工具栏添加到我的主要活动中,并在每个片段中传播所有工具栏设置,我是对的吗?有没有一种简单的方法可以在不同的片段中设置工具栏而无需再次重做?
    【解决方案2】:

    我选择另一种方法:

    创建:

    public interface HideBehaviourListener {
    
    onHide();
    onRestore();
    
    }
    
    public interface ToolbarHideListener extends HideBehaviourListener {
    
    }
    
    public interface TabLayoutHideListener extends HideBehaviourListener {
    
    }
    

    现在,在您的 Fragment 中添加:

    public class SomeFragment {
    
    private ToolbarHideListener toolbarListener;
    private TabLayoutHideListener tabLayoutListener;
    
    @Override
    public void onAttach(final Context context) {
    super.onAttach(context);
    toolbarListener = (ToolbarHideListener) context;
    tabLayoutListener = (TabLayoutHideListener) context;
    }
    
    public void onResume() {
    toolbarListener.onHide();
    tabLayoutListener.onHide();
    }
    
    public void onPause() {
    toolbarListener.onRestore();
    tabLayoutListener.onRestore();
    }
    }
    

    所以...在您的 Activity 中,需要使用您的逻辑实现该接口。使用这种方法,您的 Fragments 不知道 Activity 的任何资源或行为。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多