4

我正在为一个项目使用 Android 的原生 ActionBar(不是 sherlock)。我有 1 个 FragmentActivity 和 3 个片段:其中 2 个是 ListFragment,另一个是 Fragment。

在我最初的“主页”片段中,我在我的应用程序的 ActionBar 中设置了一个自定义视图(微调器),并在我的主页片段的 onActivityCreated() 中设置了这个:

ActionBar actionBar = getActivity().getActionBar();
    actionBar.setCustomView(R.layout.homepage_spinner);
    Spinner spinner = (Spinner) actionBar.getCustomView().findViewById(R.id.homepage_selection_spinner);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
                                                                         R.array.homepage_selection_spinner_text,
                                                                         android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    spinner.setSelection(mSpinnerListener.getCurrentPosition());
    spinner.setOnItemSelectedListener(mSpinnerListener);

然后在 onStart() 中:

getActivity().getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME);
getActivity().getActionBar().setDisplayHomeAsUpEnabled(false);
setHasOptionsMenu(true);

主页片段中的所有内容都运行良好。完全没有问题。当我切换到下一个片段时,我使用它来尝试摆脱自定义视图(微调器)并在 onStart() 中显示我的应用程序的向上按钮、主页和标题:

getActivity().getActionBar().setDisplayShowCustomEnabled(false);
getActivity().getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE);
setHasOptionsMenu(true);

当我最初转到此片段时,它显示主页、向上按钮,但不显示标题。然后,当我转到应用程序的最后一个片段时,结果完全相同。但是当我在这些片段上旋转手机时,它会像我希望的那样显示标题。我知道发生这种情况是因为正在重新创建活动,因此当我旋转手机时操作栏的自定义视图被删除。我已经通过运行 getActionBar().getCustomView(); 的测试确认了这一点。并检查它何时为空而不是。

注意:
- 我的主页片段在 onCreate() 中有 setRetainInstance(true)。
- 我试过:getActionBar().setCustomView(null); 没有运气
- 试过 getActionBar().setDisplayShowCustomEnabled(false);, setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE);, setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM); 都具有相同的效果

4

3 回答 3

2

在进行更多测试并观察 Android 在不同 ActionBar 场景下的表现后,我找到了一个可行的解决方案。有点hacky,但这是我发现工作的唯一方法。它实际上与自定义视图无关......

Android 似乎将 ActionBar 基于它在创建 Activity 时设置的片段。让我用一个例子来解释一下:假设我们有 1 个活动和 2 个片段。片段“A”具有以下选项集:

getActivity().getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM);

片段“B”设置了以下选项:

getActivity().getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE);

当应用程序第一次启动并出现片段 A 时,没有标题。这很好,因为我没有为片段 A 包含 ActionBar.DISPLAY_SHOW_TITLE。当我转到片段 B 时,它也没有显示标题。这就是这里的全部问题。片段 B 说要显示标题,但事实并非如此。

但是,如果您在片段 B 聚焦时旋转手机,则会显示标题。回到片段A然后回到片段B,标题仍然出现。奇怪的...

如果在片段 B 聚焦时旋转手机,则会显示标题。回到片段A然后回到片段B,标题仍然出现。所以一切都很好,回到片段A,旋转手机,我们回到原来的问题,就像应用程序第一次启动一样。因此,Android 似乎遵循在创建 Activity 时聚焦的片段上的 ActionBar 上显示的“规则”。

这是我的解决方案。就像我想要的那样工作:
在片段 A 中:

getActivity().getActionBar().setTitle("");
getActivity().getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_TITLE);

然后在片段 B 中:

getActivity().getActionBar().setTitle(R.string.app_name);
getActivity().getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE);
于 2013-05-26T02:10:18.500 回答
1

你试过getActionBar().getCustomView().setVisibility(View.GONE);吗?此时自定义视图不为空,现在设置为空。:)

您的自定义视图将不可见,也无法接收触摸事件。

于 2013-05-24T14:53:26.603 回答
0

您可以通过以下方式获取标题和主页图标

getActivity().getActionBar().setTitle("Title");
getActivity().getActionBar().setDisplayShowHomeEnabled(true);
getActivity().getActionBar().setDisplayShowTitleEnabled(true);
getActivity().getActionBar().setDisplayShowCustomEnabled(false);
于 2014-09-15T07:08:21.520 回答