我的应用程序中有3个片段,如HomePage , Frag1 ,Frag2,Frag3,Frag4.
所以发生了什么我在我的应用程序中使用了导航抽屉。在主页上我有一个网格视图,其中包含所有四个片段的链接。
如果用户从Homepage -> Frag1 -> Frag1.2 ->Frag1.3 ->HomePage.
所以onBack按我希望显示之前的片段,但是一旦用户进入主页,如果他按下后面我想关闭我的应用程序。我不知道如何做到这一点。
这就是我从导航抽屉中调用碎片的方式:
protected void getUrl(int position) {
FragmentTransaction fragTran = getSupportFragmentManager()
.beginTransaction();
switch (position) {
case 0:
fragTran.replace(R.id.content_frame, dashboardFragment);
fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// fragTran.addToBackStack(null);
fragTran.commit();
break;
case 1:
if (CommonUtils.isNetworkConnected(getApplicationContext())) {
fragTran.replace(R.id.content_frame, frag1);
fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragTran.addToBackStack(null);
fragTran.commit();
} else {
Toast.makeText(getApplicationContext(),
"No Network Connection", Toast.LENGTH_LONG).show();
}
break;
case 2:
if (CommonUtils.isNetworkConnected(getApplicationContext())) {
fragTran.replace(R.id.content_frame, frag2);
fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragTran.addToBackStack(null);
fragTran.commit();
} else {
Toast.makeText(getApplicationContext(),
"No Network Connection", Toast.LENGTH_LONG).show();
}
break;
case 3:
if (CommonUtils.isNetworkConnected(getApplicationContext())) {
fragTran.replace(R.id.content_frame, frag3);
fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragTran.addToBackStack(null);
fragTran.commit();
} else {
Toast.makeText(getApplicationContext(),
"No Network Connection", Toast.LENGTH_LONG).show();
}
break;
default:
// return "";
}
}
这就是我从 GridView onClick:
调用的方式final FragmentTransaction fragTran = getFragmentManager()
.beginTransaction();
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int arg2,
long arg3) {
if (DASHBOARD_LINKS[arg2].equals("frag1")) {
if (CommonUtils.isNetworkConnected(getActivity())) {
fragTran.replace(R.id.content_frame,
frag1);
fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragTran.addToBackStack(null);
fragTran.commit();
} else {
Toast.makeText(getActivity(), "No Network Connection",
Toast.LENGTH_LONG).show();
}
}
if (DASHBOARD_LINKS[arg2].equals("frag2")) {
fragTran.replace(R.id.content_frame, frag2);
fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragTran.addToBackStack(null);
fragTran.commit();
}
if (DASHBOARD_LINKS[arg2].equals("frag3")) {
fragTran.replace(R.id.content_frame, frag3);
fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragTran.addToBackStack(null);
fragTran.commit();
}
}
});
答案 0 :(得分:6)
像这样添加你的片段:
int count = fragmentManager.getBackStackEntryCount();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_frame, dashboardFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(String.valueOf(count))
.commit();
然后,当您点击网格时,只需按照上图所示添加它们。但如果您单击导航抽屉中的项目,请在执行此操作之前执行此操作:
fragmentManager.popBackStackImmediate("0", 0); // "0" here is a tag of transaction you added before. "0" is for first added fragment (your home fragment, I assume). You can pop back stack to second with "1", if you like
这将清除以前片段的记忆,你不会回到&#34;返回&#34;按压。
最后,在您的活动中实施此功能:
@Override
public void onBackPressed() {
if (fragmentManager.getBackStackEntryCount() <= 1) {
finish();
return;
}
super.onBackPressed();
}
如果您在第一个家庭片段中,这将完成您的应用。
答案 1 :(得分:2)
只需使用addToBackStack(null);
fragTran.replace(R.id.content_frame, dashboardFragment);
fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragTran.addToBackStack(null);
fragTran.commit();
所以一旦你用addToBackStack(null)添加新的片段,它会将实例保存到内存中,然后按下它会弹出当前片段并加载前一片段。
答案 2 :(得分:0)
您可以分别为每个片段类设置静态标志。在Fragment Activity中标记的片段检查值的背压。 &安培;根据用于执行操作的片段类的调用backpress方法