【发布时间】:2016-08-23 14:42:21
【问题描述】:
我知道之前在这里讨论过的这个主题,但它们都对我的代码没有任何意义。我做了什么:
在 Home.java 中(导航抽屉主活动)将此用于导航抽屉功能
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
Fragment fragment = null;
Class fragmentClass = null;
if (id == R.id.nav_breakfast) {
fragmentClass = Breakfast.class;
} else if (id == R.id.nav_lunch) {
fragmentClass = Lunch.class;
} else if (id == R.id.nav_wallet) {
fragmentClass = Wallet.class;
} else if (id == R.id.nav_history) {
fragmentClass = History.class;
} else if (id == R.id.nav_reset) {
fragmentClass = ResetPass.class;
} else if (id == R.id.nav_send) {
fragmentClass = ContactUs.class;
} else if (id == R.id.nav_help) {
fragmentClass = Help.class;
} else if (id == R.id.nav_about) {
fragmentClass = AboutUs.class;
}
try {
assert fragmentClass != null;
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null).commit();
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
assert drawer != null;
drawer.closeDrawer(GravityCompat.START);
return true;
}
通过单击导航抽屉项目选择打开每个声明的片段。另一方面,我还创建了另一个片段,该片段设置为在 Home 活动实际启动时默认打开
if (savedInstanceState == null) {
Fragment fragment = null;
Class fragmentClass;
fragmentClass = AllProduct.class;
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
在 onBackPressed() 上我使用了这个:
@Override
public void onBackPressed() {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
}
else if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
}
else if (doubleBackToExitPressedOnce) {
super.onBackPressed();
}
else {
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Press again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
}, 2000);
}
所有片段活动都以这种方式编码:
public class AllProduct extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_all_product, container, false);
return view;
}
@Override
public void onResume() {
super.onResume();
getActivity().setTitle(R.string.app_name);
}
}
现在一切正常,只有一个问题。假设我想从导航抽屉(不是上面提到的默认片段)打开 Fragment [1],然后再次打开导航抽屉并打开 Fragment [2],然后是 Fragment [3]。现在假设我在 Fragment [3] 中,通过按下后退按钮,我直接想要转到上面提到的 Default 片段。它首先进入片段 [2],片段 [1],然后是默认片段。但是我想在任何地方,在哪个片段中,我必须通过按下后退按钮回到默认片段。
【问题讨论】: