Java 如何通过在导航抽屉活动中单击后退按钮从其他片段返回特定片段
我知道前面讨论过这个主题,但没有一个对我的代码有帮助。我所做的: 在Home.java中(导航抽屉主活动)将其用于导航抽屉功能Java 如何通过在导航抽屉活动中单击后退按钮从其他片段返回特定片段,java,android,Java,Android,我知道前面讨论过这个主题,但没有一个对我的代码有帮助。我所做的: 在Home.java中(导航抽屉主活动)将其用于导航抽屉功能 @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); Fragment fragment = null; Class fragmentClass = null; if (id == R
@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;
}
通过单击导航抽屉项选择打开每个已声明的片段。另一方面,我还创建了另一个片段,该片段设置为在主活动实际启动时默认打开
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);
}
}
现在一切正常,只有一个问题。假设我想从导航抽屉中打开片段[1](不是上面提到的默认片段),然后再次打开导航抽屉并打开片段[2],然后打开片段[3]。现在假设我在片段[3]中,通过按下后退按钮,我直接想要进入上面提到的默认片段。它首先进入片段[2],片段[1],然后是默认片段。但我想知道我在哪一个片段中,我必须按后退按钮返回默认片段。确定最后解决这个问题,只需从onNavigationItemSelected中删除.addToBackStack(null)。然后添加:
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
Fragment fragment = null;
Class fragmentClass;
fragmentClass = AllProduct.class;
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
return true;
}
return false;
}
});
在onResume()下的每个片段中
并删除:
else if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
}
只用
getSupportFragmentManager()
.beginTransaction()
.replace(...)
.addToBackStack("tag").commit()
并删除所有其他代码,尤其是onBackPressed()中的代码