我在同一个HomeFragment
中有一个LoginFragment
和Activity
。首先显示HomeFragment
,然后转到LoginFragment
。但当我回到HomeFragment
时,它会重新加载HomeFragment
。
当我从HomeFragment
按回来时,如何使LoginFragment
无法重新加载。
提前致谢。这是我的代码:
MainActivity.java
private void setEvent() {
img_action_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
closeKeyboard(getApplication(), img_action_back.getWindowToken());
onBackPressed();
}
});
}
@Override
public void onBackPressed() {
if (fragment instanceof LoginFragment)
{
LoginFragment loginFragment = (LoginFragment)fragment;
if(loginFragment.fromDrawer)
Navigator.showHomeFragment(mContext);
else
finish();
}
}
}
Navigator.java
public static void showHomeFragment(Context context) {
final FragmentTransaction transaction =
getFragmentManager(context).beginTransaction();
transaction.replace(CONTAINER_ID, new HomeFragment());
transaction.commit();
}
public static void showLoginFragment(Context context,Boolean fromDrawer,String infoRegister) {
final FragmentTransaction transaction =
getFragmentManager(context).beginTransaction();
transaction.replace(CONTAINER_ID,
LoginFragment.newInstance(fromDrawer,infoRegister),"login");
transaction.commit();
}
答案 0 :(得分:3)
您的问题是,当您按下时,您正在重新创建新的HomeFragment
实例。你应该弹出FragmentManager
后台。
@Override
public void onBackPressed() {
if (fragment instanceof LoginFragment) {
LoginFragment loginFragment = (LoginFragment)fragment;
if(loginFragment.fromDrawer) {
getFragmentManager(mContext).popBackStack();
} else {
finish();
}
}
}
您还需要确保将LoginFragment
添加到Backstack。
public static void showLoginFragment(Context context,Boolean fromDrawer,String infoRegister)
{
final FragmentTransaction transaction =
getFragmentManager(context).beginTransaction();
transaction.replace(CONTAINER_ID,
LoginFragment.newInstance(fromDrawer,infoRegister),"login");
transaction.addToBackStack(null);
transaction.commit();
}
答案 1 :(得分:1)
@SunnySydeUp有一个很好的答案。我在你的代码中发现了一些改进范围。
您需要在后端堆栈中添加Fragment
,以便super.onBackPressed
调用不会像其他答案所说的那样再次重新创建Fragment
。
但是,由于您真的担心重新创建Fragment
,您可能会初始化它们一次并在事务期间再次使用该实例。
因此,在您onCreate
的{{1}}函数中,首先将这两个函数初始化为这样。
Activity
现在您的private HomeFragment mHomeFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
mHomeFragment = new HomeFragment();
}
可能看起来像
onBackPressed
@Override
public void onBackPressed() {
if (fragment instanceof LoginFragment) {
if(loginFragment.fromDrawer) {
super.onBackPressed();
} else {
finish();
}
}
}
Navigator.java