嗨,我有一个活动和三个片段。当我替换我的第一个片段时,我将它添加到backstack。
FragmentTransaction fragmentTransaction = getFragmentManager()
.beginTransaction();
fragmentTransaction.replace(R.id.authentication_parent0_linear,
new LoginFragment(), LOGINTAG);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
但是当我在另外两个片段之间移动时,我不会将它们添加到backstack中。所以当我从其他两个片段按回来时,我需要回到第一个片段。当我删除第一个片段并添加第二个片段时,它工作正常片段或删除第一个并添加第三个,即当我按回来时,我将回到第一个片段。但是当我在这两个片段之间导航时,会删除第二个并添加第三个或删除第三个并添加第二个等。在那个例子,当我按下我退出应用程序并且backstackcount显示为零,但是当我第一次删除第一个片段时,我将它存储在后台中。
getFragmentManager()
.beginTransaction()
.replace(R.id.authentication_parent0_linear,
new SignupFragment(), SIGNUPTAG).commit();
所以我的问题是片段backstack会在提交之间重置。如果是这样,我怎样才能第一次在后台堆叠中获取存储的片段
答案 0 :(得分:0)
实现您想要的最佳方式是不使用片段的后台堆栈。
addToBackStack()
在实例字段mLoginFragment中保留第一个片段LoginFragment
引用。添加您的第一个片段将如下所示(可能在活动中onCreate()
:
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
mLoginFragment = new LoginFragment();
fragmentTransaction.replace(R.id.authentication_parent0_linear, mLoginFragment, LOGINTAG);
fragmentTransaction.commit();
覆盖onBackPressed()
方法,如下所示:
@Override
public void onBackPressed() {
Fragment fr = getFragmentManager().findFragmentById(R.id.authentication_parent0_linear);
// chek that mLoginFragment!=null, basically this should never happen!
if (fr == mLoginFragment) {
super.onBackPressed();
} else {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.authentication_parent0_linear, mLoginFragment, LOGINTAG);
fragmentTransaction.commit();
}
}
使用backstack有一种麻烦的方法可以达到预期的效果。方法如下:
addToBAckStack()
addToBackStack()
当从B更深地导航到C等时,在事务之前调用popBackStack()
。可以在SO上找到它的说明。像这样:
getFragmentManager().popBackStack();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.authentication_parent0_linear, new FragmentC(), "whatever");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
答案 1 :(得分:0)
片段管理器允许您将名称(或TAG)放在给定状态。如果将相同的名称传递给popBackStack,它将弹出状态直到达到该状态。例如
// Add initial fragment
getFragmentManager()
.beginTransaction();
.replace(R.id.authentication_parent0_linear, new LoginFragment());
.addToBackStack(TAG_FIRST_FRAGMENT_STATE) // The key is not passing null here
.commit();
// Add other fragments like such
getFragmentManager()
.beginTransaction();
.replace(R.id.authentication_parent0_linear, new SignupFragment());
.addToBackStack(null)
.commit();
// On back press
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 1) {
fragmentManager.popBackStack(TAG_FIRST_FRAGMENT_STATE, 0);
} else {
super.onBackPress();
}
}
答案 2 :(得分:0)
我最终想通了。基于Kirill K回答
public class MainActivity extends Activity implements OnClickAuthentication,
LoginInterface, SignupInterface {
FragmentManager fragmentManager;
FragmentTransaction fragmentTransaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag("one");
if (fragment == null) {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
.replace(R.id.relative, new OneFragment(), "one");
fragmentTransaction.commit();
}
}
@Override
public void onClickAuthButton(int flag) {
if (flag == 2) {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
.replace(R.id.relative, new TwoFragment(), "two");
fragmentTransaction.commit();
} else {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.relative, new ThreeFragment(),
"three");
fragmentTransaction.commit();
}
}
@Override
public void switchToSignup() {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
.replace(R.id.relative, new ThreeFragment(), "three");
fragmentTransaction.commit();
}
@Override
public void switchToLogin() {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.relative, new TwoFragment(), "two");
fragmentTransaction.commit();
}
@Override
public void onBackPressed() {
Fragment twoFragment = fragmentManager.findFragmentByTag("two");
Fragment threeFragment = fragmentManager.findFragmentByTag("three");
if ((twoFragment != null && twoFragment.isVisible())
|| (threeFragment != null && threeFragment.isVisible())) {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
.replace(R.id.relative, new OneFragment(), "one");
fragmentTransaction.commit();
} else {
super.onBackPressed();
}
}
}
答案 3 :(得分:0)
我这样做了
FragmentManager fm = getFragmentManager();
fm.beginTransaction().replace(R.id.content_frame , new main_fragment()).commit();
void replaceFragment (Fragment fragment) {
Fragment current = fm.findFragmentById(R.id.content_frame);
//Check if that frag is already opened
if (!current.getClass().equals(fragment.getClass())) {
String backStateName = fragment.getClass().getName();
boolean fragmentPopped = fm.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
//fragment is not in back stack,so add it.
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack(backStateName);
ft.commit();
}
}
else {
//if fragmentPopped is true then it will auto pop up the fragment
//so we dnt have to do anything here
}
}
replaceFragment(new yourfragment());
public void onBackPressed() {
int backStackEntryCount = fm.getBackStackEntryCount();
if (backStackEntryCount == 0) {
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Closing Activity")
.setMessage("Are you sure you want to close this Application?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
System.exit(0);
}
})
.setNegativeButton("No", null)
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
//backpress over alert dialog
finish();
System.exit(0);
}
})
.show();
} else {
super.onBackPressed();
}
}