片段 addToBackStack 行为

Fragment addToBackStack behaviour

我在 Android 中遇到两个片段问题。

我的 MainActivity 中有一个带有 Navigation Drawer Fragment 的应用程序。当我单击此导航抽屉上的一个项目时,一个新片段将加载到 Main Activity 内的 "fragment_placeholder" 上。很简单。

创建 MainActivity 时,我正在 fragment_placeholder 中加载 "homeFragment"。该片段有一个带有两个选项卡的 SlidingTabLayout,每个选项卡加载它对应的片段。这个主页片段是我的 "main" 应用程序的一部分。

当我点击 Navigation Drawer 中的另一个项目时,Home Fragment 被替换为另一个 Fragment,例如,当我点击 "My account" 时,"My account fragment" 加载到 fragment_placeholder.我在导航抽屉中有 3 个项目。

我想将 Home Fragment(以及其中的两个 tabs/fragments)保留在返回堆栈中,这样我就可以在任何片段(我的帐户、配置等)上导航,并在我按下返回键时导航按钮,我要回到 Home Fragment。

我尝试在 MainActivity 的 onCreate 中添加 ToBackStack Home Fragment(在我提交之前),但无法正常工作。如果我按下导航抽屉上的 "My account" 项,然后按下后退,应用程序会再次加载 "My account" 片段,如果我再次按下后退,应用程序将关闭。另一种情况:如果我按下 "Home" 项,然后按下返回,应用程序返回到同一个主页片段但没有任何选项卡(它没有加载属于他的两个片段)。

这是我的应用程序:

这是我的代码: 主要Activity

public class MainActivity extends ActionBarActivity {

private Toolbar mToolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setupDrawer();

    // Loading home fragment
    if (findViewById(R.id.fragment_placeholder) != null) {

        if (savedInstanceState != null) {
            return;
        }
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        HomeFragment homeFragment = new HomeFragment();
        homeFragment.setArguments(getIntent().getExtras());

        fragmentTransaction.replace(R.id.fragment_placeholder, homeFragment);
        fragmentTransaction.addToBackStack(null); // This is not working properly
        fragmentTransaction.commit();
    }
}

导航抽屉:itemClicked 方法

 @Override
public void itemClicked(View view, int position) {

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    switch(position)
    {
        // Home
        case 0:
            HomeFragment homeFragment = new HomeFragment();
            fragmentTransaction.replace(R.id.fragment_placeholder, homeFragment);
            break;

        // My account
        case 1:
            MyAccountFragment myAccountFragment = new MyAccountFragment();
            fragmentTransaction.replace(R.id.fragment_placeholder, myAccountFragment);
            break;

        // Config
        case 2:
            ConfigFragment configFragment = new ConfigFragment();
            fragmentTransaction.replace(R.id.fragment_placeholder, configFragment );
            break;

    }

    fragmentTransaction.commit();
    mDrawerLayout.closeDrawer(mDrawerListView);


}

谢谢你,对不起我的英语。

我根据这个答案找到了解决方案

我将代码更改为:

public void onBackPressed() {
    HomeFragment homeFragment = new HomeFragment();
    displayFragment(homeFragment);
}

 private void displayFragment(Fragment pFragment) {

   // Fragment currently inside the placeholder view
   Fragment fr = (Fragment) getSupportFragmentManager()
            .findFragmentById(R.id.fragment_placeholder);

   // If this fragment is a HomeFragment, close app
   if (fr instanceof HomeFragment) {
        finish();
   }
   else {
        // Replace curretly Fragment by HomeFragment
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.fragment_placeholder, pFragment);
        ft.commit();
   }
}