我正在构建一个非常简单的应用程序.它的核心是2个屏幕:
1)列表屏幕:项目列表
2)细节屏幕:项目的详细视图
我使用一个Activity(扩展AppCompatActivity)与Action-Bar,Navigation-Drawer和主内容部分(FrameLayout).
我在2个屏幕上使用了2个不同的片段:
打开应用程序时,我将列表片段扩展到主要内容部分.
当单击列表中的项目时,我将详细信息片段膨胀到主要内容部分,这一切都运行良好.
在详情屏幕上,我希望Action-Bar显示一个返回列表屏幕的按钮.
考虑到我使用片段而不是单独的活动这一事实,我该如何实现?
您可以在每次加载详细信息片段时启用向上按钮,并在任何其他片段加载时禁用它.
首先在Activity中定义这些方法,您可以从Fragments调用这些方法以显示/隐藏向上按钮:
public void showUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } public void hideUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); }
您可能只想在详细信息碎片的Resume()中启用向上按钮(MainActivity只是一个示例,更改为您的Activity的名称).....
@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(); } }
接下来就是让按钮实际返回.首先确保将带有向上按钮的Fragment添加到后端堆栈,然后将其添加到该Fragment.
@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(); } }