我正在构建一个非常简单的应用程序。它的核心是2个屏幕:
1)列表屏幕:项目列表
2)细节屏幕:项目的详细视图
我使用了一个Activity(扩展了AppCompatActivity),包含一个Action-Bar,一个Navigation-Drawer和一个main-content部分(一个FrameLayout)。
我在2个屏幕上使用了2个不同的片段:
当打开应用程序时,我将列表片段膨胀到主要内容部分
当单击列表中的项目时,我将详细信息片段膨胀到主要内容部分,这一切都运行良好。
在详情屏幕上,我希望Action-Bar显示一个返回列表屏幕的上行按钮。
考虑到我使用片段而不是单独的活动这一事实,我该如何实现?
答案 0 :(得分:5)
每次加载细节片段时都可以启用向上按钮,并在任何其他片段加载时禁用它。
首先在您的Activity中定义这些方法,您可以从片段中调用这些方法以显示/隐藏向上按钮:
public void showUpButton() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public void hideUpButton() {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
您可能只想在详细信息碎片的Resume()中启用向上按钮(MainActivity只是一个示例,更改为您的活动名称).....
@Override
public void onResume() {
super.onResume();
MainActivity activity = (MainActivity)getActivity();
if (activity != null) {
activity.showUpButton();
}
}
然后在其他片段中:
@Override
public void onResume() {
super.onResume();
MainActivity activity = (MainActivity)getActivity();
if (activity != null) {
activity.hideUpButton();
}
}
接下来就是让按钮实际返回。首先确保您将带有向上按钮的片段添加到后台堆栈,然后将其添加到该片段。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
((MainActivity)getActivity()).onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
然后在Activity中,如果FragmentManager有任何条目,则覆盖onBackPressed()并从后栈弹出:
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 1) {
fragmentManager.popBackStackImmediate();
} else {
super.onBackPressed();
}
}