0

好吧,我知道还有其他问题乍一看会让这个问题看起来像重复,但这些答案都不适用于我的情况,

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

所以我尝试使用 addToBackStack ,当我移动到另一个片段时,如果我按下后退按钮,它会回到我的第一个片段(完全按照我的意愿)但是再次按下后退按钮会让我看到白屏(我想知道这是否是由于到我使用下面包含的交易动画)所以为了解决这个问题,我尝试覆盖后退按钮并调用完成();但这会导致即时消息中的任何片段完成而不是返回到第一个片段,我从上述链接和许多其他链接中尝试了一些解决方法,但找不到合适的修复任何建议?

这是我的主要活动 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; 

但没有任何运气

4

3 回答 3

3

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

编辑:这是对问题的解释,因此您可以弄清楚如何解决它:

每次将片段事务添加到返回堆栈时,您都允许用户通过按下返回按钮将其还原,并且 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();
    }
}
于 2015-07-28T20:00:30.817 回答
0

BladeCoders 的回答更多是试图告诉我后台堆栈是如何工作的,而不是回答我的问题,我最终没有向后台堆栈添加任何片段,.addToBackStack(null),并覆盖 MainActivity 中的后退按钮,感觉有点像hack,但效果很好

@Override
public void onBackPressed() {
    FragmentManager fragmentManager = getSupportFragmentManager();

if (fragmentManager.getBackStackEntryCount() < 1){
        Fragment fragment = new FirstFragment();
        FragmentTransaction fragmentTransaction =    
        getSupportFragmentManager().beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.enter, R.anim.exit, 
        R.anim.pop_enter, R.anim.pop_exit);

        getSupportActionBar().setTitle(mDrawerTitle);

        fragmentTransaction.replace(R.id.frame_container, 
        fragment).addToBackStack("first").commit();

    }else{
        finish();
    }
}
于 2015-07-29T10:13:13.317 回答
-2

你甚至可以在没有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);
    }
}
于 2015-12-12T07:51:39.980 回答