当前位置: 首页 > 知识库问答 >
问题:

在片段上更改屏幕方向之前,无法摆脱ActionBar中的自定义视图

孙翰墨
2023-03-14

我正在使用Android自带的ActionBar(不是sherlock)进行一个项目。我有1个FragmentActivity和3个片段:其中2个是ListFragments,另一个是片段。

在我最初的“homepage”片段中,我在应用程序的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()中显示向上按钮、home和我的应用程序的标题:

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

当我最初转到这个片段时,它显示home,up按钮,但不是标题。然后,当我转到应用程序的最后一个片段时,得到了相同的精确结果。但当我在这些碎片上旋转手机时,它会像我希望的那样显示标题。我知道这是因为正在重新创建活动,所以当我旋转手机时,actionbar的自定义视图会被删除。我已经通过运行getActionBar()的测试证实了这一点。getCustomView();并在其为空和不为空时进行检查。

注意:我的主页片段在onCreate()中有setRetainInstance(true)
-我尝试了:getActionBar()。setCustomView(空);运气不好-尝试了getActionBar()。setDisplayShowCustomEnabled(false);,setDisplayOptions(ActionBar.DISPLAY\u SHOW\u TITLE);,setDisplayOptions(ActionBar.DISPLAY\u SHOW\u TITLE | ActionBar.DISPLAY\u SHOW\u CUSTOM,ActionBar.DISPLAY\u SHOW\u CUSTOM);都具有相同的效果

共有3个答案

长孙波鸿
2023-03-14

你可以通过

getActivity().getActionBar().setTitle("Title");
getActivity().getActionBar().setDisplayShowHomeEnabled(true);
getActivity().getActionBar().setDisplayShowTitleEnabled(true);
getActivity().getActionBar().setDisplayShowCustomEnabled(false);
陶元凯
2023-03-14

您是否尝试过getActionBar()。getCustomView()。设置可见性(View.GONE) ?此时,自定义视图不是null,现在将其设置为null.:)

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

尹凌龙
2023-03-14

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

Android似乎将ActionBar基于创建活动时设置的片段。让我用一个例子来解释:假设我们有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时,没有标题。这很好,因为我没有包括ActionBar。DISPLAY\u SHOW\u片段A的标题。当我转到片段B时,它也不显示标题。这就是整个问题所在。片段B表示要显示标题,但事实并非如此。

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

如果在片段B聚焦时旋转手机,则会显示标题。返回片段A,然后html" target="_blank">返回片段B,标题仍然显示。所以一切都很好,回到片段A,旋转手机,我们回到了最初的问题,就像应用程序第一次启动一样。因此,Android似乎遵循了在活动创建时在操作栏上集中显示片段的“规则”。

这是我的解决方案。按照我的意图工作:片段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);
 类似资料:
  • 我有一个包含多个片段的活动。我还使用actionbarSherlock作为我的标签,它也连接到片段。 我的问题是,当我要旋转屏幕(即从纵向到横向/反之亦然)时,我的活动将再次调用,因此它将重新启动我的活动。 我不想重新启动我的活动,只想恢复旋转前显示的当前片段。请不要回答android:configChanges=“orientation | keyboardHidden”,因为它并没有解决问题,

  • 我有一个以编程方式创建片段的活动。该片段内部有另一个片段。 活动包含片段A。片段A包含片段B。 如果(savedInstanceState==null){ } 但对我不起作用! null null 活动: 片段:

  • 我正在我的项目中使用ActionBar。我想改变ActionBar项目的方向意味着在屏幕的右侧找到选项卡图标和徽标,并在屏幕的左侧找到菜单项。我在谷歌上搜索了一下,但并没有找到任何有用的东西,我还阅读了API 14中主题和样式的xml资源,但我再次并没有找到任何解决方案。

  • 我正在向运行的activity添加一个带有WindowManager的相机覆盖。当我启动相机并调用WindowManager时,它将我的屏幕从纵向变为横向,即使我为WindowManager.LayoutParams分配了适当的纵向标记。还没能通过谷歌找到任何解决方案。 下面是我在服务中的方法中运行的WindowManager代码: 布局r.layout.camera只是我将相机添加到的Frame

  • 我正试图根据此答案在我的项目详细信息旁边添加删除按钮。我在一个新项目上试用过,效果非常好: 当我单击delete时,我将删除该项目。 不幸的是,当我的listView在calendar_选项卡中时,我试图在我自己的项目中使用它。xml。日历选项卡使用CompactCalendarTab。java-fragment类。所以Android Studio出错:E:\Downloads\MyCustomA