当前位置: 首页 > 知识库问答 >
问题:

保存碎片状态与Android底部导航

须衡虑
2023-03-14

我是Android开发新手,所以我不明白很多,也许是基本的东西,也许甚至陈述的主题也没有完全反映我的问题,我事先道歉,我不能更准确地表述。请帮我回答一些问题。

我的应用程序中有一个底部导航,有三个菜单项。就像图片上一样:

底部导航

最初,我是按照标准的Android Studio示例来做的:

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;
    private NavController navController;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        BottomNavigationView navView = findViewById(R.id.nav_view);
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                R.id.navigation_home, R.id.navigation_update, R.id.navigation_notifications)
                .build();

        navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);

        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        NavigationUI.setupWithNavController(binding.navView, navController);
    }
}

在这段代码中,菜单项切换片段,保存每个片段的状态(我不知道具体如何,它似乎在导航控制器内部的某个地方)。

但现在我需要中间的按钮来执行不同的功能,即不参与片段切换。

唯一适当的方法是使用setOnItemSseltedListener。

然后我的代码会是这样的:

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;
    private NavController navController;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        BottomNavigationView navView = findViewById(R.id.nav_view);
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                R.id.navigation_home, R.id.navigation_update, R.id.navigation_notifications)
                .build();

        navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);

        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        NavigationUI.setupWithNavController(binding.navView, navController);

        navView.setOnItemSelectedListener(
                new NavigationBarView.OnItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                        switch (item.getItemId()) {

                            case R.id.navigation_home:
                                navController.navigate(R.id.navigation_home);
                                break;
                            case R.id.navigation_update:
                                // work for middle menu item
                                break;
                            case R.id.navigation_notifications:
                                navController.navigate(R.id.navigation_notifications, savedInstanceState);
                                break;
                        }
                        return true;
                    }
                });
    }
}

它甚至可以工作,只是碎片不再保存它们的状态。也就是说,例如,在第一个片段中,我有一个RecyclerView,如果我向下滚动它,切换到另一个片段,然后返回,那么RecyclerView处于默认状态(未滚动),即状态尚未保存。

事实证明,在第一个版本的代码中,我不能单独使用中间的菜单项,而在第二个版本中,片段的状态不会被保存。

提示正确的方法来处理这个问题。这样中间的菜单项就可以被分配一个单独的任务,并且可以保存片段的状态。

共有1个答案

宰父淳
2023-03-14

而不是使用navView。setOnItemClickListener,您可以使用navController。addOnDestinationChangedListener,在重写的onDestinationChanged方法中,可以检查

if(destination.id ==  R.id.navigation_update) {
    //your custom action here
}
 类似资料:
  • 当我在导航抽屉中的不同片段之间切换时,我试图保存导航抽屉片段上的状态。例如:我从片段A开始触发一些事件,然后切换到片段B。然后我想在从片段B切换回片段A时看到片段A的相同状态。 我尝试使用onSavedInstanceState(Bundle savedInstanceState),但只有当片段生命周期中的方向发生变化时才会调用它。每当我切换到新片段时,都会创建一个新片段,我不知道如何从片段中保存

  • 我在我的android应用程序中使用导航抽屉,当我重新选择片段时,它会加载两次。 以下是我的代码 在每个片段中,我都使用异步任务,当我选择片段时,异步任务一次又一次地启动 请帮助我

  • 我使用底部导航视图和导航组件。请告诉我如何在切换到另一个选项卡并返回旧选项卡后不销毁片段?例如,我有三个选项卡-A、B、C。我的开始选项卡是A。导航到B后,然后返回A。当我返回选项卡A时,我不希望它被重新创建。怎么做?谢谢

  • 我搜索了很多信息,但没有一个明确的。有人能给出一个明确的解决方案和一个例子吗?

  • 在阅读了关于片段和活动的文档和讨论后,我想我已经把情况弄清楚了。 活动应该为用户提供一个屏幕,用户可以在其中工作。导航到其他屏幕通常会破坏活动。 片段应该提供很少或单个功能组件,可以在活动中再次使用。片段的内容应该相互独立地工作,因此可以在多个活动中重用。 虽然这一切似乎都有道理,但有一件事我无法理解: 如果您创建一个新的Android应用程序,并选择创建Android导航抽屉应用程序的选项,为什

  • 我可以使用一个片段作为一个活动吗?我已经创建了一个片段,但我希望它有像活动一样的功能,所以我使用片段扩展碎片活动。然而,我有一个带有碎片的导航抽屉。当我更改为“扩展碎片活动”时,我的代码有问题?请给我指路。