1

我一直在阅读有关片段和片段返回处理的信息,但在这里仍然找不到最佳解决方案。

我有导航抽屉。

当我点击 item1 时,假设我的导航抽屉列表中有 2 个项目(item1,item2),它打开了 A Fragment。点击in按钮后在A Fragment中打开B Fragment。因此,当打开 B 片段并从导航抽屉中选择 item2 时,将打开 C 片段。

现在,当我按下后退按钮时,它应该完成活动而不是转到 B 片段。

所以一句话,当我选择 item1 时,item2 打开 A 片段或 C 片段,按下后退按钮后应该完成活动,但是当打开 B 片段(在 item1 下)时,它必须回到 A 片段

请帮助这对我来说非常困难。谢谢

public class MainActivity extends DefaultActivity {
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggleWrapper mDrawerToggle;
    private ListView mDrawerListView;
    private TextView mTitle;
    private Runnable mPendingRunnable;
    private Handler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mDrawerListView = (ListView) findViewById(R.id.left_drawer);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mFragmentManager = getSupportFragmentManager();
        mHandler = new Handler();

        LayoutInflater inflator = (LayoutInflater) this .getSystemService(LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.custom_view, null);
        mTitle = (TextView)v.findViewById(R.id.title);

        getSupportActionBar().setBackgroundDrawable(null);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        getSupportActionBar().setDisplayShowCustomEnabled(true);
        getSupportActionBar().setDisplayUseLogoEnabled(false);
        getSupportActionBar().setDisplayShowHomeEnabled(false);
        getSupportActionBar().setIcon(R.drawable.button_indicator_menu);
        getSupportActionBar().setCustomView(v);

        v.findViewById(R.id.menu).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!mDrawerLayout.isDrawerOpen(GravityCompat.START)){
                    mDrawerLayout.openDrawer(GravityCompat.START);
                }else {
                    mDrawerLayout.closeDrawers();
                }
            }
        });

        mDrawerToggle = new ActionBarDrawerToggleWrapper(this, mDrawerLayout, R.drawable.transparent_gic, R.string.drawer_open, R.string.drawer_close){
            public void onDrawerClosed(View view) {
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                if (mPendingRunnable != null) {
                    mHandler.post(mPendingRunnable);
                    mPendingRunnable = null;
                }
            }

            public void onDrawerOpened(View drawerView) {
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };
        mDrawerToggle.addPartnerToggle(new ContentDisplaceDrawerToggle(this, mDrawerLayout, R.id.content_frame));
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        setLeftDrawerLeftMenu();

        getFragment(getString(R.string.home));
        setTitle(getString(R.string.home));
    }

    private void setLeftDrawerLeftMenu(){
        final ArrayList<Item> items = new ArrayList<Item>();
        items.add(new SectionItem(this,"icons_small_home",getString(R.string.home)));

        items.add(new SectionItem(this,"icons_small_myacounts",getString(R.string.my_account)));
        items.add(new EntryItem(getString(R.string.bonuses)));
        items.add(new EntryItem(getString(R.string.account_recharge)));
        items.add(new EntryItem(getString(R.string.tariff_plans)));
        items.add(new EntryItem(getString(R.string.languages)));


        EntryAdapter adapter = new EntryAdapter(MainActivity.this, items);

        mDrawerListView.setAdapter(adapter);

        mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                EntryItem item = (EntryItem) items.get(i);
                    setTitle(item.getTitle());
            }
        });
    }


    public void setTitle(final String title){
        mTitle.setText(title);
        mPendingRunnable = new Runnable() {
            @Override
            public void run() {
                getFragment(title);
            }
        };

        mDrawerLayout.closeDrawers();
    }

    public void getFragment(String name){
        if(getString(R.string.orange_shops).equalsIgnoreCase(name)){
            if (!(mSelectedFragment instanceof OrangeShopsFragment)){
                addPage(new MyFragment(MainActivity.this),true);
            }
        }else if(getString(R.string.home).equals(name)){
            addPage(new HomeFragment(MainActivity.this),false);
        }else{
            throw new RuntimeException("unknown fragment "+ name);
        }
    }

 public void addPage(final DefaultFragment pDefaultFragment, final boolean isAddToBackStack){
        FragmentTransaction transaction = mFragmentManager.beginTransaction();
        transaction.replace(R.id.content_frame, pDefaultFragment);
        if (isAddToBackStack) transaction.addToBackStack(null);
        transaction.commitAllowingStateLoss();
    }
}
4

2 回答 2

3

清除backstack并不是那么困难。

每当用户单击抽屉上的任何项目时,只需调用

while(getSupportFragmentManager.popBackStackImmediate()){}

清除你以前的东西。

编辑:

我知道这是一个老问题,但我发现了一种更好/更有效的方法:

fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

一位Android工程师回答了这个groups.google.com问题,我在我的应用程序上替换了它,“清除堆栈”命令现在工作得更快了。希望能帮助到你。

于 2013-09-19T12:26:03.430 回答
1

我在使用片段和导航抽屉时也遇到了这个问题。当我们从一个片段导航到另一个片段时,它们都被添加到同一个后台堆栈中。所以这就是你遇到这个问题的原因。为了克服这个问题,我自己维护了回栈并处理了 on backpressed 方法

如果您发布代码,我会为您的问题提出一个很好的解决方案

于 2013-09-19T12:23:05.697 回答