java - 如何在 Android 的片段中使用 onBackPress 按钮
问题描述
在我的应用程序中NavigationView
,NavigationView
我已经设置了打开一些菜单fragments
!
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="320dip"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#000"
android:fitsSystemWindows="true"
app:headerLayout="@layout/tester_drawer_header"
app:itemIconTint="#fff"
app:itemTextColor="#fff"
app:menu="@menu/tester_drawer_main"/>
我想在单击此菜单时打开一个fragment
,我想在进入嵌套fragments
并按下onBack
按钮时打开第一个片段而不是打开 backStackfragments
!
我写了下面的代码,但是点击返回button
后fragments
,backStack
我想先打开fragment
!
我的活动代码:
public class TesterDashboardActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tester_dashboard);
loadFragment(new TesterTestListFragment(), userName);
}
@Override
public void onBackPressed() {
fragmentBackCount = getSupportFragmentManager().getBackStackEntryCount();
if (fragmentBackCount <= 1) {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
//finishAffinity();
super.onBackPressed();
}
} else {
getSupportFragmentManager().popBackStack();
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.nav_home:
loadFragment(new TesterTestListFragment(), userName);
break;
case R.id.nav_billing:
loadFragment(new TesterFinanceFragment(), context.getString(R.string.menu_billing));
break;
case R.id.nav_edit_profile:
loadFragment(new TesterProfileFilterEditFragment(), context.getString(R.string.menu_edit_profile));
break;
case R.id.nav_bank:
loadFragment(new TesterShebaFragment(), context.getString(R.string.menu_bank));
break;
case R.id.nav_report:
loadFragment(new TesterReportsFragment(), context.getString(R.string.menu_report));
break;
case R.id.nav_setting:
loadFragment(new TesterSettingFragment(), context.getString(R.string.menu_setting));
break;
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
public void loadFragment(Fragment fragment, String toolbarTitle) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.testerFragment, fragment,TAG_FRAGMENT);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
toolbar.setTitle(toolbarTitle);
}
我该如何解决?
解决方案
在您的代码中,我发现fragmentBackCount>1
您只需调用getSupportFragmentManager().popBackStack();
一次,因此您将在 backstack 上看到顶部片段。我认为你应该调用getSupportFragmentManager().popBackStack();
,fragmentBackCount-1 时间来到达第一个 Fragmnet
else {
for(int i=0;i<fragmentBackCount-1;i++)
getSupportFragmentManager().popBackStack();
}
推荐阅读
- javascript - 如何使用 JavaScript Webdriver 访问 Selenium 的日志以查看网络请求
- sql - 将一列的值复制到不同行的另一列
- javascript - 在Javascript中的特定时间绘制正方形然后移动
- stream - 在 Beam 中流式传输
- kubernetes - Kubernetes 无法运行容器
- sql - SQL ORA-02063 - 如何解决这个问题?
- c# - 如何将sharepoint2010列表绑定到aspnet中继器控件
- javascript - 用于文本输入以创建 d3 图形的 Javascript 变量范围
- php - 希腊字符sql server不显示在php中
- android - 在单独的线程上使用 Android Room 的处理程序