我目前正在为我要开发的应用程序奠定基础。有一个操作栏,其中指定了几个菜单项。每个菜单项都有自己的片段,需要在主活动中显示。但是,我希望在显示除主片段本身以外的任何片段时,显示操作栏的“向上”功能。
我目前的方法是基于actionbar up navigation with fragments提出的解决方案,如下所示:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    int id = item.getItemId();

    Fragment fragment = null;

    if (id == R.id.action_identities) {
        fragment = new IdentitiesFragment();
    } else if (id == R.id.action_history) {
        fragment = new HistoryFragment();
    } else if (id == R.id.action_settings) {
        fragment = new SettingsFragment();
    } else if (id == R.id.action_about) {
        fragment = new AboutFragment();
    }

    if (fragment != null) {
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.container, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}

@Override
public void onBackStackChanged()
{
    displayHomeAsUp();
}

private void displayHomeAsUp()
{
    int stackCount = getFragmentManager().getBackStackEntryCount();
    getActionBar().setDisplayHomeAsUpEnabled(stackCount > 0);
}

@Override
public boolean onNavigateUp()
{
    getFragmentManager().popBackStack();
    return true;
}

这很好,但是当多次按下同一个菜单项时会出现问题,因为每次都会有一个新的片段实例放在后面的堆栈上。防止这种情况发生的最佳方法是什么?很明显,我可以检查当前显示的片段是否是被请求的片段,但这会导致很多检查,而且有点多余。另一种方法可能是事务标记,但我不确定这是否会导致更干净的代码。
最好的方法是什么?这不是一个普通的问题,还是我希望应用程序“表现”错误?因为就我个人而言,我非常喜欢动作条的“向上”功能。

最佳答案

我就是这样解决这个问题的
在每个片段上附加一个标记,在将任何片段添加到后堆栈中之前,请检查堆栈中是否已经存在该标记?
样例代码

public void replaceFragment(Fragment fragment, String FRAGMENT_TAG) {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.container, fragment, FRAGMENT_TAG);

    if (getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG) == null) {
        if (AppConstants.DEBUG) {
            Toast.makeText(MainActivity.this, "Inside Fragment add", Toast.LENGTH_SHORT).show();
        }
        fragmentTransaction.addToBackStack(FRAGMENT_TAG);
    }

    fragmentTransaction.commit();
}

09-10 13:01
查看更多