Android无需重新加载即可移至上一个片段

时间:2016-09-29 03:59:12

标签: android android-fragments

我在同一个HomeFragment中有一个LoginFragmentActivity。首先显示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();
}

2 个答案:

答案 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