android-fragments 使用Android BottomNavigation保存片段状态

t5fffqht  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(212)

我是Android开发新手,所以我不懂很多东西,也许是基本的东西,甚至可能是陈述的主题没有完全反映我的问题,我提前道歉,我不能表达得更精确。请帮助我解决一些问题。
我在我的应用程序中有一个BottomNavigation,它有三个菜单项。就像图片上的一样:
bottom nav
最初,我按照标准的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);
    }
}

在这段代码中,菜单项切换片段,保存每个片段的状态(我不知道具体是如何保存的,它似乎在导航控制器中的某个地方)。
但是现在我需要中间的按钮来执行一个不同的功能,即不参与切换片段。
执行此操作的唯一适当方法是使用setOnItemSelectedListener。
那么我的代码看起来就像这样:

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处于默认状态(未滚动),即状态尚未保存。
在第一个版本的代码中,我不能单独使用中间的菜单项,而在第二个版本中,片段的状态没有保存。
提示正确的方法来处理这个问题.这样中间的菜单项就可以被分配一个单独的工作,并且片断的状态可以被保存。

l5tcr1uw

l5tcr1uw1#

您可以使用navController.addOnDestinationChangedListener来代替navView.setOnItemClickListener,并且在已覆盖的onDestinationChanged方法中,可以检查

if(destination.id ==  R.id.navigation_update) {
    //your custom action here
}
roejwanj

roejwanj2#

我可以使用Navigation用标准工具解决这个问题。我只是找到了一个菜单项,并向其中添加了一个OnClickListener。

BottomNavigationItemView updateBtn = findViewById(R.id.navigation_update);
updateBtn.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
       // todo
   }
});

因此,切换片段和单击中间菜单项都可以正常工作。

相关问题