1

我认为有两个问题是相关的。背景:我有三个底部导航项,它们导致其他布局和活动;其中之一是家庭。

  1. 在 Home 中,执行 onClick 时,将打开选定的活动和布局,但选定的图标仅在单击时突出显示,然后突出显示 Home。如果再次按下,则会突出显示选定的布局图标。如何在第一次单击时突出显示图标?

  2. 主页还有三个其他按钮,可引导其他活动。选择房屋时,返回家园需要大量时间。为什么呢?其他活动/布局暂时是空的。我需要在后台运行服务吗?主页 Java/Activity 代码不长,但需要很长时间才能返回。

真的很感激一些想法。也许答案是零碎的,但不确定这是否能解决第一个问题?我已经包含了我的代码,用于从主页进行底部导航。问候, 爱德华

PS 我一个月前才开始使用 Java 和 Android Studio。

    //Declare navigation view ID (bottomnav_view) in content_main
    BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomnav_view);
    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.ic_home: break;
                case R.id.ic_instruments:
                    Intent intentinstruments = new Intent(MainActivity.this, InstrumentListActivity.class);
                    startActivity(intentinstruments);
                    break;
                case R.id.ic_methods:
                    Intent intentmethods = new Intent(MainActivity.this, MethodsActivity.class);
                    startActivity(intentmethods);
                    break;
            }
            return true;
        }
    });
    //End of bottom hav handler
4

3 回答 3

2

在实现 BottomNavigationView 时,总是首选片段。

试试这个方法。

bottomNavigationView.setOnNavigationItemSelectedListener(new  
    BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment selectedFragment = null;

        switch (item.getItemId()){
            case R.id.navigation_News:
                selectedFragment = ItemoneFragment.newInstance();
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.content,selectedFragment);
                transaction.addToBackStack(null);
                transaction.commit();
                return true;

            case R.id.navigation_profile:
                selectedFragment = ItemtwoFragment.newInstance();
                transaction = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.content,selectedFragment);
                transaction.addToBackStack(null);
                transaction.commit();
                return true;

        }
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.content, selectedFragment);
        transaction.commit();
        return true;
    }
});
于 2019-01-17T04:28:45.883 回答
2

简而言之,使用BottomNavigationView.setOnNavigationItemSelectedListener

但是NavigationUI.setupWithNavController内部调用setOnNavigationItemSelectedListener,所以任何以前的OnNavigationItemSelectedListener都将被丢弃

如果要注入一些超出系统行为的代码,请使用以下方法

// Apply default system behavior, so you don't have to handle fragment transaction manually
navView.setupWithNavController(navController) 

navView.setOnNavigationItemSelectedListener {
    if (NavigationUI.onNavDestinationSelected(it, navController)) {
        true
    } else {
        when (it.itemId) {
            R.id.test -> true
            else -> false
        }
    }
}
于 2021-06-09T04:15:08.690 回答
1

注意:如果您将底部导航视图与包含导航图、导航主机和导航控制器的导航组件一起使用,则在 BottomNavigationView.OnNavigationItemSelectedListener片段事务中将不起作用。您需要使用navigationController.navigate 如下所示:-

        navController = Navigation.findNavController(view); 
        bottomNavigationView =findViewById(R.id.nav_view);
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @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_received_files_list:
                        navController.navigate(R.id.navigation_received_files_list);
                        break;
                }
                return true;
            } 
于 2020-08-30T18:16:35.747 回答