android - 在 fragment 的屏幕方向发生变化之前,无法摆脱 ActionBar 中的自定义 View

标签 android android-fragments android-actionbar android-spinner

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

在我最初的“主页” fragment 中,我在我的应用程序的 ActionBar 中设置了一个自定义 View (微调器),并在我的主页 fragment 的 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);

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

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

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

注意事项:
- 我的主页 fragment 在 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);都是一样的效果

最佳答案

在进行更多测试并观察 Android 在不同 ActionBar 场景下的行为方式后,我找到了一个可行的解决方案。有点老套,但这是我发现的唯一可行的方法。其实跟自定义view没关系……

Android 似乎将 ActionBar 基于它在创建 Activity 时设置的 fragment 。让我用一个例子来解释: 假设我们有 1 个 Activity 和 2 个 fragment 。 fragment “A”设置了这些选项:

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

fragment “B”设置了这些选项:

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

当应用首次启动并出现 fragment A 时,没有标题。这很好,因为我没有为 fragment A 包含 ActionBar.DISPLAY_SHOW_TITLE。当我转到 fragment B 时,它也没有显示标题。这就是这里的全部问题。 fragment B 说要显示标题,但实际上不是。

但是,如果您在聚焦 fragment B 时旋转手机,则会显示标题。返回 fragment A,然后返回 fragment B,标题仍然显示。奇怪...

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

这是我的解决方案。就像我预期的那样工作:
在 fragment A 中:

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

然后在 fragment B 中:

getActivity().getActionBar().setTitle(R.string.app_name);
getActivity().getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE);

关于android - 在 fragment 的屏幕方向发生变化之前,无法摆脱 ActionBar 中的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16736686/

相关文章:

java - 警报对话框自定义

android - 如何使用工作管理器 2.0 返回 ListenableFuture<Result>?

android - 在 fragment 中显示 fragment 查看器

Android - 弹出窗口未显示在 fragment 中

Android在 GridView 上制作操作栏覆盖

文件中的 Android Studio : Remove all System. out.println()?

java - 每次我更改标签时标签 fragment 获取数据

android - 根据 fragment 条件显示/隐藏菜单

java - 操作栏不显示项目

android - 当用户向下滚动到列表末尾时,如何在 Cwac-Endlessadapter 中设置加载列表项的限制