将微调器添加到 ActionBar(不是导航

Posted

技术标签:

【中文标题】将微调器添加到 ActionBar(不是导航【英文标题】:Adding spinner to ActionBar (not Navigation 【发布时间】:2012-07-07 19:56:24 【问题描述】:

我使用答案 here 中的第二个选项向我的 ActionBar 添加了一个微调器。

如何向微调器添加微调器适配器?我尝试使用 Google 描述的 Spinner 对象here,但得到一个空 Spinner 对象。

有人知道怎么做吗?我不希望微调器位于操作栏的导航区域中,而是与其他操作项一起(我正在使用拆分操作栏)。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我知道这是一个老问题,但以防万一有人偶然发现它(就像我一样)并且仍然在寻找完整的答案,这里是如何使用兼容性库来做到这一点,以便它从 v7 开始工作(android 2.1 Eclair)到当前 v19(Android 4.4 KitKat):

在 menu_layout.xml 中:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >

  <item android:id="@+id/spinner"
    yourapp:showAsAction="ifRoom"
    yourapp:actionViewClass="android.widget.Spinner" />
</menu>

使用别名为 yourapphttp://schemas.android.com/apk/res-auto 命名空间使您能够使用旧版本 Android 上不存在的属性 showAsAction 和 actionViewClass。

然后在您的活动代码中:

@Override
public boolean onCreateOptionsMenu(Menu menu) 
    getMenuInflater().inflate(R.menu.menu_layout, menu);
    MenuItem item = menu.findItem(R.id.spinner);
    Spinner spinner = (Spinner) MenuItemCompat.getActionView(item);
    spinner.setAdapter(adapter); // set the adapter to provide layout of rows and content
    spinner.setOnItemSelectedListener(onItemSelectedListener); // set the listener, to perform actions based on item selection

等等!

【讨论】:

如果您不想担心旧版本,那么您的应用命名空间不是必需的,您可以使用 android 命名空间。此外,这与 CursorLoaders 配合得非常好。 由于目前 Android 2.3.3 (API v10) 仍占 android 市场约 18% 的份额(有关当前数字,请参阅 Android Dashboard),我认为提供兼容性答案很重要.但是如果您的应用程序最小目标 sdk 高于 Android 3.0 (API v11),那么 android 命名空间就足够了。 @lalitm 如果您注意到,它是用于兼容性库的。如果您的目标是成为 BC,则绝对需要。 关于此的警告:在 Android 版本 6.0.1 的 Nexus 6 上进行测试 - 我发现如果 ActionBar 上的 Spinner 没有空间 - 它不会显示选项。它不适用于正常的菜单位置。参考 showAsAction 设置。所以在小屏幕上它最终可能会成为一个坏控制。 好消息:showAsAction="ifRoom|collapseActionView" 似乎在菜单和操作栏上都能正常工作...如果您的用户有一个小屏幕,我建议您使用这种组合。【参考方案2】:

我知道你放弃了微调器,但我会在这里给出一些提示,以防其他人遇到同样的问题,或者你在不同的应用程序中开发相同的模式

如果您得到 null 是因为您没有正确指定 ID。仔细检查 ID。 在您通过指定只是一个微调器的 actionLayout 显示的复杂内容的链接中,您只需指定一个 actionViewClass="android.widget.Spinner" 即可。

然后在OnCreateOptionsMenu 你这样做:

inflater.inflate(R.menu.my_menu, menu); // inflate the menu
Spinner s = (Spinner) menu.findItem(R.id.my_menu_spinner).getActionView(); // find the spinner
SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActivity().getActionBar()
        .getThemedContext(), R.array.my_menu_spinner_list, android.R.layout.simple_spinner_dropdown_item); //  create the adapter from a StringArray
s.setAdapter(mSpinnerAdapter); // set the adapter
s.setOnItemSelectedListener(myChangeListener); // (optional) reference to a OnItemSelectedListener, that you can use to perform actions based on user selection

愉快的编码...

【讨论】:

知道这将如何用于自定义适配器吗?我在 Spinner 中使用图像而不是文字来显示,因此对于自定义适配器,SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActivity().getActionBar() .getThemedContext(), R.array.my_menu_spinner_list, android.R.layout.simple_spinner_dropdown_item); 行必须不同。不知道怎么做。 只需调用自定义适配器上的任何构造函数。 SpinnerAdapter mSpinnerAdapter = new MyCustomAdapter() 感谢 Budius,我确实这样做了,但由于某种原因,下拉菜单没有发生。我认为这是因为我的自定义适配器中缺少android.R.layout.simple_spinner_dropdown_item(因为它使用 Spinner 行作为 ImageView,这是可绘制数组进入的地方)。但不确定这是否是问题所在。如果你想查看我的代码:***.com/questions/30433501/… 这个问题仍然没有答案。谢谢。【参考方案3】:

好吧,我放弃了使用子菜单的 Spinner 想法。我意识到微调器是用于选择保持选中状态的东西。子菜单接缝以更好地适应 UI。

【讨论】:

【参考方案4】:
inflater.inflate(R.menu.my_menu, menu); // inflate the menu 

Spinner s = (Spinner) menu.findItem(R.id.my_menu_spinner).getActionView();     // find the spinner 
SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActivity().getActionBar() .getThemedContext(), R.array.my_menu_spinner_list, android.R.layout.simple_spinner_dropdown_item);    // create the adapter from a StringArray 
s.setAdapter(mSpinnerAdapter);   // set the adapter 
s.setOnItemSelectedListener(myChangeListener);    // (optional) reference to a OnItemSelectedListener, that you can use to perform actions based on user selection

【讨论】:

以上是关于将微调器添加到 ActionBar(不是导航的主要内容,如果未能解决你的问题,请参考以下文章

在 AsyncTask 中动态地将项目添加到微调器

如何将项目添加到 Android 中的微调器?

Android - 将 ActionBar 后退按钮切换为导航按钮

将微调器 gif 添加/删除到无限滚动?

如何将加载指示器或“微调器”添加到剑道角 2 网格?

添加自定义加载微调器(SVG)reactjs