android - Android Navigation Back(汉堡包)总是带出抽屉
问题描述
因此,我构建了一个应用程序,其中包含几个主要页面作为顶级目标片段。用户可以在主页面(一、二、三等)内单击以调出更多详细信息片段(page_one_item1_details、page_two_item3_details 等)。这样做时,汉堡包按钮会按预期变为后退箭头。
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration mAppBarConfiguration;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
final Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
final NavController navController = Objects.requireNonNull(
(NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment))
.getNavController();
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home,
R.id.nav_main_page_one,
R.id.nav_main_page_two,
R.id.nav_main_page_three,
R.id.nav_main_page_four)
.setOpenableLayout(drawerLayout).build();
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(
(NavigationView) findViewById(R.id.nav_view), navController);
final ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(
this, drawerLayout, toolbar, R.string.drawer_open,
R.string.drawer_close) {
@Override
public void onDrawerSlide(final View drawerView, final float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(drawerView.getWindowToken(), 0);
}
};
drawerLayout.addDrawerListener(actionBarDrawerToggle);
actionBarDrawerToggle.syncState();
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onSupportNavigateUp() {
return NavigationUI.navigateUp(
Navigation.findNavController(this, R.id.nav_host_fragment), mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
}
如果我单击 Android 后退按钮,应用程序将按预期返回到主页片段,但如果我单击顶部的后退按钮(代替汉堡包),它会打开抽屉而不是返回。谁能告诉我我是否遗漏了什么?我需要更改我的 MainActivity 代码,还是必须将一些代码放在其他地方?我在上面的代码中对 onSupportNavigateUp 尝试了几种变体,但它仍然总是会打开抽屉。
我也试过:
return Navigation.findNavController(this, R.id.nav_host_fragment), drawerLayout)
|| super.onSupportNavigateUp();
和
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp()
注意 - 即使删除 onSupportNavigateUp 在任何情况下仍然总是会打开抽屉。没有后退功能。
解决方案
不要使用ActionBarDrawerToggle
.
来自 android 开发者网站: 覆盖 onSupportNavigateUp() 以处理向上导航
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, appBarConfiguration)
|| super.onSupportNavigateUp();
}
推荐阅读
- android - 无法在 google play 上更新已发布的 android 应用 apk
- html - html css table td控件根据屏幕分辨率和内容调整宽度
- javascript - DOM 元素(节点)
- php - 使用 laravel 从控制器返回更多值到视图的最佳方法是什么?
- python - 在Django中提交表单后如何使用对象ID重定向到新页面?
- javascript - 您如何在 Shopify 上将颜色的产品选项分为“必需品”和“限量版”两类?
- php - 登录页面重定向到laravel 6中的身份验证后的空白页面
- jquery - 如何在图像加载时更改元素的高度?
- java - 如何在 JavaFX 中的密码字段本身中屏蔽和取消屏蔽 JFXPasswordField 的字符
- mysql - 已解决触发器以检查预留 mysql 的可用性