我目前正在为我要开发的应用程序奠定基础。有一个操作栏,其中指定了几个菜单项。每个菜单项都有自己的片段,需要在主活动中显示。但是,我希望在显示除主片段本身以外的任何片段时,显示操作栏的“向上”功能。
我目前的方法是基于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();
}