我正在使用Android的原生ActionBar(不是sherlock)来进行项目。我有1个FragmentActivity和3个片段:其中2个是ListFragments,另一个是片段。
在我的首页"主页"片段,我在我的应用程序的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);
当我最初访问此片段时,它会显示home,up按钮,但不显示标题。然后,当我转到应用程序的最后一个片段时,同样的结果。但是当我在这些片段上旋转手机时,它就像我希望的那样显示标题。我知道这种情况正在发生,因为正在重新创建活动,因此当我旋转手机时,操作栏的自定义视图正在被删除。我已经通过运行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);都具有相同的效果
答案 0 :(得分: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遵循在创建活动时关注的片段上的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);
答案 1 :(得分:1)
你试过getActionBar().getCustomView().setVisibility(View.GONE);
吗?
此时,自定义视图不为null,现在将其设置为null。 :)
您的自定义视图将不可见,也无法接收触摸事件。
答案 2 :(得分:0)
您可以通过
取回标题和主页图标getActivity().getActionBar().setTitle("Title");
getActivity().getActionBar().setDisplayShowHomeEnabled(true);
getActivity().getActionBar().setDisplayShowTitleEnabled(true);
getActivity().getActionBar().setDisplayShowCustomEnabled(false);