如何从包含的片段控制活动的向上按钮?

时间:2015-12-01 16:35:47

标签: android android-layout android-fragments navigation-drawer

我正在构建一个非常简单的应用程序。它的核心是2个屏幕:
1)列表屏幕:项目列表
2)细节屏幕:项目的详细视图

我使用了一个Activity(扩展了AppCompatActivity),包含一个Action-Bar,一个Navigation-Drawer和一个main-content部分(一个FrameLayout)。
我在2个屏幕上使用了2个不同的片段:

当打开应用程序时,我将列表片段膨胀到主要内容部分 当单击列表中的项目时,我将详细信息片段膨胀到主要内容部分,这一切都运行良好。 My App Layout
在详情屏幕上,我希望Action-Bar显示一个返回列表屏幕的上行按钮。
考虑到我使用片段而不是单独的活动这一事实,我该如何实现?

1 个答案:

答案 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();
    }
}