Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在活动之间使用BottomNavigationView按下时如何突出显示项目?_Java_Android_Bottomnavigationview_Android Navigation_Android Bottomnav - Fatal编程技术网

Java 在活动之间使用BottomNavigationView按下时如何突出显示项目?

Java 在活动之间使用BottomNavigationView按下时如何突出显示项目?,java,android,bottomnavigationview,android-navigation,android-bottomnav,Java,Android,Bottomnavigationview,Android Navigation,Android Bottomnav,我为我的应用程序添加了底部导航视图,但我需要活动之间的底部导航视图,而不是片段,因此我为我的所有3个活动将此代码添加到Java中 当我在手机中选择第二项或第三项时,所有内容都是正确的,但问题是突出显示的内容会转到第一项。 我需要突出显示我按下的项目 我已经使用了fragment,它工作得很好,但我仍然是使用fragment的初学者,所以我正在使用活动。 第一个活动代码是: BottomNavigationView mBottomNavigation; mBottomNavigation

我为我的应用程序添加了底部导航视图,但我需要活动之间的底部导航视图,而不是片段,因此我为我的所有3个活动将此代码添加到Java中

当我在手机中选择第二项或第三项时,所有内容都是正确的,但问题是突出显示的内容会转到第一项。

我需要突出显示我按下的项目

我已经使用了fragment,它工作得很好,但我仍然是使用fragment的初学者,所以我正在使用活动。

第一个活动代码是:

BottomNavigationView mBottomNavigation;

    mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator);

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.Nav_Second:
                    Intent Second= new Intent(First.this, Second.class);
                    startActivity(Second);
                    break;
                case R.id.Nav_Third:
                    Intent Third= new Intent(First.this, Third.class);
                    startActivity(Third);
                    break;
            }

            return true;
        }
    });


}}
第二项活动是:

底部导航视图MBototomnavigation

    mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator);

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.Nav_First:
                    Intent First= new Intent(Second.this, First.class);
                    startActivity(First);
                    break;
                case R.id.Nav_Third:
                    Intent Third= new Intent(Second.this, Third.class);
                    startActivity(Third);
                    break;
            }

            return true;
        }
    });

}}
    mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator);

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.Nav_First:
                    Intent First= new Intent(Third.this, First.class);
                    startActivity(First);
                    break;
                case R.id.Nav_Second:
                    Intent Second= new Intent(Third.this, Second.class);
                    startActivity(Second);
                    break;
            }

            return true;
        }
    });


}}
第三项活动是:

底部导航视图MBototomnavigation

    mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator);

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.Nav_First:
                    Intent First= new Intent(Second.this, First.class);
                    startActivity(First);
                    break;
                case R.id.Nav_Third:
                    Intent Third= new Intent(Second.this, Third.class);
                    startActivity(Third);
                    break;
            }

            return true;
        }
    });

}}
    mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator);

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.Nav_First:
                    Intent First= new Intent(Third.this, First.class);
                    startActivity(First);
                    break;
                case R.id.Nav_Second:
                    Intent Second= new Intent(Third.this, Second.class);
                    startActivity(Second);
                    break;
            }

            return true;
        }
    });


}}
xml对于3个活动是相同的:


您可以将BottomNavigationView与表示选项卡的活动一起使用。关键是在每个活动中重复导航视图组件,并让每个活动的代码控制导航组件:在导航项目上启动正确的活动单击,并在活动启动后选择正确的导航项目

您需要延迟启动新选择的活动(选项卡),以便在新活动替换上一个活动之前完成选项卡切换动画

我的方法是让代表选项卡的所有活动从实现公共行为的同一BaseActivity类继承

以下是示例BaseActivity的代码:

public abstract class BaseActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

    protected BottomNavigationView navigationView;

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

        navigationView = (BottomNavigationView) findViewById(R.id.navigation);
        navigationView.setOnNavigationItemSelectedListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        updateNavigationBarState();
    }

    // Remove inter-activity transition to avoid screen tossing on tapping bottom navigation items
    @Override
    public void onPause() {
        super.onPause();
        overridePendingTransition(0, 0);
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        navigationView.postDelayed(() -> {
            int itemId = item.getItemId();
            if (itemId == R.id.navigation_home) {
                startActivity(new Intent(this, HomeActivity.class));
            } else if (itemId == R.id.navigation_dashboard) {
                    startActivity(new Intent(this, DashboardActivity.class));
            } else if (itemId == R.id.navigation_notifications) {
                    startActivity(new Intent(this, NotificationsActivity.class));
            }
            finish();
        }, 300);
        return true;
    }

    private void updateNavigationBarState(){
        int actionId = getNavigationMenuItemId();
        selectBottomNavigationBarItem(actionId);
    }

    void selectBottomNavigationBarItem(int itemId) {
        Menu menu = navigationView.getMenu();
        for (int i = 0, size = menu.size(); i < size; i++) {
            MenuItem item = menu.getItem(i);
            boolean shouldBeChecked = item.getItemId() == itemId;
            if (shouldBeChecked) {
                item.setChecked(true);
                break;
            }
        }
    }

    abstract int getContentViewId();

    abstract int getNavigationMenuItemId();

}
公共抽象类BaseActivity扩展AppCompativity实现BottomNavigationView.OnNavigationItemSelectedListener{
受保护的底部导航视图导航视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(getContentViewId());
navigationView=(BottomNavigationView)findViewById(R.id.navigation);
navigationView.setOnNavigationItemSelectedListener(此);
}
@凌驾
受保护的void onStart(){
super.onStart();
updateNavigationBarState();
}
//删除活动间转换,以避免点击底部导航项时出现屏幕翻转
@凌驾
公共无效暂停(){
super.onPause();
覆盖转换(0,0);
}
@凌驾
公共布尔值onNavigationItemSelected(@NonNull MenuItem item){
navigationView.postDelayed(()->{
int itemId=item.getItemId();
if(itemId==R.id.navigation\u home){
startActivity(新意图(本,HomeActivity.class));
}else if(itemId==R.id.navigation\u仪表板){
startActivity(新意图(此,DashboardActivity.class));
}else if(itemId==R.id.navigation\u通知){
startActivity(新意图(this,NotificationsActivity.class));
}
完成();
}, 300);
返回true;
}
私有void updateNavigationBarState(){
int actionId=getNavigationMenuItemId();
选择BottomNavigationBarItem(操作ID);
}
void selectBottomNavigationBarItem(int itemId){
Menu Menu=navigationView.getMenu();
对于(inti=0,size=menu.size();i
这是我基于Android Studio底部导航活动模板的整个示例:


对于仍在寻找这一点的人来说,@javazian关于扩展每一项活动的回答在我看来真是太过分了

更简洁的解决方案是检索导航菜单并手动检查相关菜单项

注意:在下面的示例中,此处插入索引需要替换为菜单项的索引(例如,最左边的菜单项的索引为0)


您完全可以将BottomNavigationView用于活动,但不建议这样做。 最好与片段一起使用,主要好处是:

  • BottomNavigationView中的动画(如果是活动,则不会延迟)
  • 容易保持碎片的状态
  • 柔性背驮
但是如果您想坚持活动,那么@javaxian answer非常好,但我们可以改进它:

  • 如果我们的布局文件没有具有正确id的底部导航,那么我们将有异常。更好的方法是为带有导航的活动提供公共布局文件 解决方案

    1) 将BaseActivity重命名为BaseNavigationActivity

    2) 为所有活动创建一个布局文件(例如
    activity\u navigation.xml
    ),并显式调用BaseNavigationActivity
    setContentView(R.layout.activity\u navigation)

    3) 删除
    抽象int getContentViewId()

  • selectBottomNavigationBarItem(intItemId)中的代码是开销,我们可以做得更简单
  • 解决方案(科特林):

    您可以在每个活动开始时使用

    bottomNavigationView.setSelectedItemId(R.id.menu_item_id);
    

    如果R.id.menu_item_id位于menu/navigate_items

    中,除非我遗漏了什么,否则这是一个使用片段的好方案(它工作得非常完美),所以为什么不坚持这一点呢?因为片段比主要活动要难一点……我怎样才能让应用程序通过AppCompativeActivity进行扩展呢?看看吧,我很高兴听到这个消息。你应该考虑添加一个答案,以便它可以帮助其他人。我看到你的代码如何保持活动的碎片状态,当我按Tab 1向下滚动,然后按Tab 2,然后按下Tab1它滚动我,而不是使用过度依赖的过渡。