我目前正在设计一个应用程序的基础架构,涉及到IT技术。有一个带有几个菜单项的操作栏。每个菜单项都有自己的片段,需要在主活动中显示。然而,我希望当除MainFragment之外的任何片段被显示时,“向上”箭头出现在操作栏中。
我的当前方法基于在actionbar up navigation with fragments中提出的解决方案,看起来像这样:
这个可以很好地工作,但是当多次按下相同的菜单项时会出现问题,因为每次都会将片段的新实例放入返回堆栈中。有什么最好的方法可以防止这种情况发生?显然,我可以检查当前显示的片段是否是被请求的那个片段,但这会导致很多检查并且有点冗余。另一种方式可能是事务标记,但我不确定是否会导致更清晰的代码。
什么是最好的方法?这不是一个通用问题吗,或者说我希望应用程序“表现”方式不正确吗?因为个人非常喜欢操作栏的“向上”功能。
我的当前方法基于在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;
}
这个可以很好地工作,但是当多次按下相同的菜单项时会出现问题,因为每次都会将片段的新实例放入返回堆栈中。有什么最好的方法可以防止这种情况发生?显然,我可以检查当前显示的片段是否是被请求的那个片段,但这会导致很多检查并且有点冗余。另一种方式可能是事务标记,但我不确定是否会导致更清晰的代码。
什么是最好的方法?这不是一个通用问题吗,或者说我希望应用程序“表现”方式不正确吗?因为个人非常喜欢操作栏的“向上”功能。
getClass()
和/或isInstance()
?看起来你们没有我上面提到的问题,那么你们是如何处理操作栏的向上箭头的?我的项目处于早期阶段,所以如果你能给我充分的理由,我很乐意进行调整。;) - Karol Babioch