片段addToBackStack行为

时间:2015-04-08 13:21:58

标签: android fragment navigation-drawer

我在Android中面临两个片段问题。

我的MainActivity中有一个带有导航抽屉片段的应用。当我单击此导航抽屉上的项目时,将在主活动内的“fragment_placeholder”上加载一个新片段。很简单。

创建MainActivity时,我在fragment_placeholder中加载“homeFragment”。这个片段有一个带有两个选项卡的SlidingTabLayout,每个选项卡都加载了相应的片段。这个Home Fragment是我应用程序的“主要”部分。

当我点击导航抽屉中的另一个项目时,主页片段将替换为另一个片段,例如,当我点击“我的帐户”时,“我的帐户片段”将加载到fragment_placeholder上。我在导航抽屉里有3个itens。

我想将Home Fragment(及其中的两个标签/片段)保留在后台堆栈上,这样我就可以浏览任何片段(我的帐户,配置等),当我按下后退按钮时,我我回到Home Fragment。

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

这是我的应用:

MainActivity

这是我的代码: MainActivity

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);


}

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

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,基于这个答案https://stackoverflow.com/a/14588642/1959257

我将代码更改为:

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();
   }
}