处理导航抽屉中的片段backstack

时间:2015-07-28 19:36:22

标签: android android-fragments fragment-backstack

好吧我知道还有其他questions乍一看使这个看起来像副本一样,但这些答案都不适用于我的情况,

我想要的是第一个片段显示为关于后退按钮如何工作的主要活动,我需要从我的导航抽屉中选择哪个片段,当按下后退按钮时返回第一个片段然后用户将再次按下该应用程序退出该应用程序。

所以我尝试使用addToBackStack,当我移动到另一个片段,如果我按下后退按钮它回到我的第一个片段(完全按照我想要)但按下后退按钮再次让我有一个白色的屏幕(我想知道是否这是由于交易动画我正在使用ive包含在下面)所以为了解决这个问题,我尝试重写后退按钮并抛出一个调用finish();但是这会导致我完成的任何一个片段而不是回到第一个片段,我尝试过上面提到的链接和其他很多其他的解决方法,但找不到合适的修复方法吗?

这是我的主要活动displayView

 private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;

    switch (position) {
        case 0:
            fragment = new FirstFragment();

            break;

        case 1:
            fragment = new glideFrag();
            break;
        case 2:
            fragment = new secondGlideFrag();
            break;
        case 3:
            fragment = new thirdGlideFrag();
            break;
        case 4:
            fragment = new forthGlideFrag();
            break;

        case 5:
            fragment = new lgFrag();
            break;
        case 6:
            fragment = new cyanFrag();
            break;
        case 7:
            fragment = new sonyFrag();
            break;
        case 8:
            fragment = new SecondFragment();
            break;

        default:
            break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.enter,R.anim.exit,R.anim.pop_enter,R.anim.pop_exit);

        //fragmentManager.beginTransaction()
                fragmentTransaction.replace(R.id.frame_container, fragment).addToBackStack("first Fragment").commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }

我发现这看起来像是一个很好的方式

private boolean popNext = false;

  if(popNext){
        if(position == INITIAL_POSITION){
            onBackPressed();
            mDrawerLayout.closeDrawer(mDrawerList);
            popNext = false;
            return;
        }
        getSupportFragmentManager().popBackStackImmediate();
    }
    else{
        if(position == INITIAL_POSITION){
            mDrawerLayout.closeDrawer(mDrawerList);
            return;
        }
        popNext=true;
    }

但我仍然相当新的android,我不知道该怎么设置INITIAL_POSITION,我试过

private static final INITIAL_POSITION = 0; 

但没有运气

3 个答案:

答案 0 :(得分:3)

添加初始片段时,您必须将其添加到后台堆栈。 你必须只为下一个做。当后台堆栈为空时,活动将完成。

编辑:以下是问题的解释,以便您了解如何解决问题:

每次向后台堆栈添加片段事务时,都允许用户通过按后退按钮来恢复它,并且Activity将返回到事务之前的状态。如果将初始片段添加到后端堆栈,则当用户按下时,屏幕将变为空白,因为在添加初始片段之前没有显示任何内容。这就是为什么不能将第一个可见片段添加到Activity的初始片段事务添加到后台堆栈的原因。通常你初始化初始片段如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null) {
        Fragment fragment = new FirstFragment();
        getSupportFragmentManager().beginTransaction()
            .add(R.id.frame_container, fragment)
            .commit();
    }
}

答案 1 :(得分:0)

BladeCoders的回答是试图告诉我背板是如何工作而不是回答我的问题,我最后没有在后台堆栈中添加任何片段,.addToBackStack(null),并且在MainActivity中覆盖后退按钮,感觉就像一点点有点黑客但完美无缺

photoButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

        }
    });

答案 2 :(得分:-1)

即使没有 backstack ,你也可以这样做,这只是我的观点,以简化它,以便它可以帮助一些人。

 @Override
public void onBackPressed(){

    Fragment f = getSupportFragmentManager().findFragmentById(R.id.container_body);
    if(f.getClass().getName().equals(HomeFragment.class.getName())){ // here HomeFragment.class.getName() means from which faragment you actually want to exit
        finish();
    }else{
        displayView(0);  //were you want to go when back button is pressed
    }

}





private void displayView(int position) {
    Fragment fragment = null;
    String title = getString(R.string.app_name);
    switch (position) {
        case 0:
            fragment = new HomeFragment();
            title = getString(R.string.app_name);
            break;
        case 1:
            fragment = new OffersFragment();
            title = getString(R.string.nav_item_offers);
            break;
        case 2:
            fragment = new NotificationFragment();
            title = getString(R.string.nav_item_notifications);
            break;

        default:
            break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.container_body, fragment);
        fragmentTransaction.commit();

        // set the toolbar title
        getSupportActionBar().setTitle(title);
    }
}