首页 > 解决方案 > 导航上每个不同片段的不同 FAB 点击监听器

问题描述

在我的应用程序的当前实现中,我正在使用Navigation 组件。在我的主要内容中,我为所有人提供了一个浮动操作按钮。同时,当需要转换时,导航控制器会自动处理 7 个不同的片段。

mAppBarConfiguration =
        new AppBarConfiguration.Builder( navigationDrawerFragmentIds ).setDrawerLayout( drawer ).build();
NavController navController = Navigation.findNavController( this, R.id.nav_host_fragment );

直到今天,我使用 setUserVisibleHint(boolean isVisibleToUser) 方法为每个不同片段中的单个 fab 覆盖不同的行为(在点击侦听器上)。

如下所示

// FIXME: 2.11.2019 Fix deprecated methods.
@Override public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint( isVisibleToUser );
    if (isVisibleToUser && isResumed()) {
        //Only manually call onResume if fragment is already visible
        //Otherwise allow natural fragment lifecycle to call onResume
        onResume();
    } else {
        // current fragment not visible
        floatingActionButton.setOnClickListener( null );
    }
}

@Override public void onResume() {
    super.onResume();
    // FIXME: 2.11.2019 Fix deprecated methods.
    if (!getUserVisibleHint()) {
        return;
    }

    // Set listener for float action button which has been defined in main activity.
    // Here we will override the listener which can be work for our current fragment.
    floatingActionButton = getActivity().findViewById( R.id.fab );
    floatingActionButton.setOnClickListener( new View.OnClickListener() {
        @Override public void onClick(View view) {
            // do some stuff here.
        }
    } );
}

由于 setUserVisibleHint 已被弃用,我想替换新的行为,而不是像发行说明中建议的那样使用这种方法。

Max Lifecycle:您现在可以通过在 FragmentTransaction 上调用 setMaxLifecycle() 来为 Fragment 设置最大生命周期状态。这取代了现在已弃用的 setUserVisibleHint()。FragmentPagerAdapter 和 FragmentStatePagerAdapter 有一个新的构造函数,允许您切换到新的行为。

而且导航控制器也有我理解的默认 FragmentNavigator 但我不明白这对我设置片段生命周期或像这篇文章这样的行为有帮助。如果我可以像提到的帖子那样设置行为,那么我基本上可以使用 onResume 和 onStart (我认为这会像这样工作,因为当我选择 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 时,下一个片段将不会启动。我假设只有 onCreateView 调用。)

正如我上面解释的,我正在使用导航组件来处理我的片段之间的转换。这就是为什么我没有任何特殊的视图寻呼机。但是我仍然可以通过以下代码获取信息,只要片段之间发生转换,当前目的地和回调就会处理。

navController.addOnDestinationChangedListener( new NavController.OnDestinationChangedListener() {
    @Override
    public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination,
                                     @Nullable Bundle arguments) {
        Log.i( TAG, "onDestinationChanged: "  + destination.getLabel());

    }
} );

然后在我的主要活动中,我可以为我的工厂为每个片段设置不同的行为。到目前为止,这对我来说还可以。但是我想知道在使用导航组件时有什么方法可以设置片段的最大生命周期?

提前致谢。

标签: androidandroid-fragmentsnavigationfloating-action-button

解决方案


推荐阅读