【问题标题】:Fragment addToBackStack behaviour片段 addToBackStack 行为
【发布时间】:2015-06-13 11:37:22
【问题描述】:

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

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

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

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

我想将主页片段(以及其中的两个选项卡/片段)保留在后堆栈上,这样我就可以在任何片段(我的帐户、配置等)上导航,当我按下返回按钮时,我'我正在返回首页片段。

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

这是我的应用程序:

这是我的代码: 主活动

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


}

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

【问题讨论】:

    标签: android fragment navigation-drawer


    【解决方案1】:

    我找到了一个解决方案,基于这个答案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();
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 2021-09-19
      相关资源
      最近更新 更多