我认为两个相关的问题。 背景:我有三个底部导航项,它们会导致其他布局和活动。其中之一是家。
从主页执行onClick时,将打开选定的活动和布局,但是选定的图标仅在单击时突出显示,然后突出显示主页。如果再次按下,它将突出显示所选的布局图标。如何使首次点击时突出显示图标?
主页上还有其他三个按钮可以引导您进行其他活动。选择“主页”后,要花费很长时间才能返回“主页”。为什么呢?其他活动/布局目前为空。我需要在后台运行服务吗? Home Java / Activity代码并没有那么长,但是要花很长时间才能返回。
真的很感谢您的一些想法。也许答案是零散的,不确定是否可以解决第一个问题? 我已经包括了用于从首页进行底部导航的代码。 问候, 爱德华
P.S。我一个月前才开始使用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
答案 0 :(得分:1)
在实现时始终首选片段 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;
}
});
答案 1 :(得分:0)
注意:如果您将底部导航视图与包含导航图,导航主机和导航控制器的导航组件一起使用,则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;
}
答案 2 :(得分:0)
简而言之,使用BottomNavigationView.setOnNavigationItemSelectedListener
BUT,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
}
}
}