java - 如何在导航抽屉中维护片段的回栈?
问题描述
我参加了一项活动,并通过活动附加了导航抽屉和主页片段。在该导航抽屉中,有一个“联系我们”选项。当用户单击该选项时,片段会打开。但我无法维护它的堆栈。意味着当我在联系我们片段时,再次使用导航抽屉点击联系我们它与前一个重叠。我必须按两次后退按钮才能继续主页片段。请帮助我如何为此维护后台堆栈。这是我的代码..
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.rate:
Uri uri = Uri.parse("market://details?id=" + getPackageName());
Intent myAppLinkToMarket = new Intent(Intent.ACTION_VIEW, uri);
try {
startActivity(myAppLinkToMarket);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), "Unable to find source market app!", Toast.LENGTH_SHORT).show();
}
break;
case R.id.contact_us:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.fragment_container_dashboard, ContactUsFragment.newInstance());
transaction.addToBackStack(null);
transaction.commit();
mDrawerLayout.closeDrawer(GravityCompat.START);
break;
}
return false;
}
});
在这段代码之后,我使用它来维护回栈:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() != 0) {
getFragmentManager().popBackStack();
}
else new AlertDialog.Builder(this)
.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Dashboard.super.onBackPressed();
}
})
.setNegativeButton("No", null)
.show();
}
但问题是当我按下返回按钮时,它会在联系我们片段上显示退出对话框。但我想首先到达主页片段,然后如果我按下后退按钮,它会显示退出对话框。
解决方案
我通过在 onCreate 方法中添加它来解决这个问题。
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if(getSupportFragmentManager().getBackStackEntryCount() == 0){
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
menuToggle.setDrawerIndicatorEnabled(true);
// your dialog
}else{
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
menuToggle.setDrawerIndicatorEnabled(false);
// remove to your previous fragment
}
}
});
推荐阅读
- dart - Flutter PaginatedDataTable rowsPerPage
- python - 具有相同列名并应用聚合函数的内部合并数据框
- reactjs - React 状态具有数组作为属性,但是当传递它时它会嵌套到一个同名对象中?
- android - public open fun get() Picasso 的争论太多了!在 com.squareup.picasso.Picasso 中定义
- jquery - Jquery ajax禁用提交按钮,直到表单完成
- spring-boot - 使用 -XX:+UseSerialGC 与 -XX:+UseParallelGC 运行 Spring Boot 应用程序
- javafx - 组合框在其他 Windows 计算机上看不到系统字体
- c++ - C++17 枚举类型声明
- java - 单击按钮更新通知
- php - 当用户名在链接末尾时如何显示用户信息