Android 如何创建单个Select ActionProvider下拉列表?

Android 如何创建单个Select ActionProvider下拉列表?,android,android-actionbar,Android,Android Actionbar,我想要一个选择列表作为操作栏的下拉列表。由于ActionProvider支持开箱即用的子菜单,我认为这很容易。但是,虽然我可以在开始时更改选中的项目(例如,在onPrepareSubMenu()中),但一旦显示子菜单,我就无法更改选中的项目。调用setChecked()没有视觉效果 这是我的ActionProvider: /*** Copyright (c) 2016 CommonsWare, LLC Licensed under the Apache License, Version 2.

我想要一个选择列表作为操作栏的下拉列表。由于
ActionProvider
支持开箱即用的子菜单,我认为这很容易。但是,虽然我可以在开始时更改选中的项目(例如,在
onPrepareSubMenu()
中),但一旦显示子菜单,我就无法更改选中的项目。调用
setChecked()
没有视觉效果

这是我的
ActionProvider

/***
 Copyright (c) 2016 CommonsWare, LLC
 Licensed under the Apache License, Version 2.0 (the "License"); you may not
 use this file except in compliance with the License. You may obtain a copy
 of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
 by applicable law or agreed to in writing, software distributed under the
 License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
 OF ANY KIND, either express or implied. See the License for the specific
 language governing permissions and limitations under the License.

 From _The Busy Coder's Guide to Android Development_
 https://commonsware.com/Android
 */

package com.commonsware.android.hurl;

import android.content.Context;
import android.view.ActionProvider;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.view.View;
import java.util.ArrayList;

public class SingleChoiceActionProvider extends ActionProvider implements
  OnMenuItemClickListener {
  static final private int[] HTTP_STACKS_ITEM_IDS={
    R.id.hurl,
    R.id.httpclient,
    R.id.httpclient_tor};
  final private MenuInflater inflater;
  final private ArrayList<MenuItem> httpStacksItems=
    new ArrayList<MenuItem>();

  public SingleChoiceActionProvider(Context ctxt) {
    super(ctxt);
    this.inflater=new MenuInflater(ctxt);
  }

  @Override
  public View onCreateActionView() {
    return(null);
  }

  @Override
  public boolean hasSubMenu() {
    return(true);
  }

  @Override
  public void onPrepareSubMenu(SubMenu submenu) {
    submenu.clear();
    httpStacksItems.clear();

    inflater.inflate(R.menu.http_stacks, submenu);
    submenu.setGroupCheckable(R.id.http_stacks, true, true);

    for (int itemId : HTTP_STACKS_ITEM_IDS) {
      MenuItem item=submenu.findItem(itemId);

      httpStacksItems.add(item);
      item.setOnMenuItemClickListener(this);
    }
  }

  @Override
  public boolean onMenuItemClick(MenuItem item) {
/*
    for (MenuItem httpStackItem : httpStacksItems) {
      httpStackItem.setChecked(item==httpStackItem);
    }
*/

    httpStacksItems.get(2).setChecked(true);

    return(true);
  }
}
第一项显示为选中。理论上,如果我在
onMenuItemClick()
中使用了硬编码的hack,那么点击之后的任何项目都会导致第三个项目(
get(2)
)被选中。检查
isChecked()。它只是不改变屏幕上的内容。请注意,在
onPrepareSubMenu()
中调用
setChecked()
可以正常工作,因此问题仅限于在显示菜单后出现

知道我哪里出错了吗


或者,是否有另一种工作模式用于从操作栏实现这种单选下拉菜单?

问题是每次显示子菜单时都会调用
onPrepareSubMenu()
。在
onMenuItemClick
方法中设置选中的项可以正常工作,但下次显示菜单时,布局将在
onPrepareSubMenu
中重新展开,因此再次选择默认项

此外,我认为,只需对具有嵌套菜单的项进行充气即可获得类似的结果,而无需自定义
ActionProvider
,如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/http_stack"
        android:showAsAction="ifRoom"
        android:title="HTTP Stack">
        <menu>
            <group
                android:id="@+id/http_stacks"
                android:checkableBehavior="single">
            <item
                android:id="@+id/hurl"
                android:checkable="true"
                android:checked="true"
                android:title="@string/menu_hurl"/>
            <item
                android:id="@+id/httpclient"
                android:checkable="true"
                android:title="@string/menu_httpclient"/>
            <item
                android:id="@+id/httpclient_tor"
                android:checkable="true"
                android:title="@string/menu_httpclient_tor"/>
            </group>
        </menu>
    </item>
</menu>


我正在使用支持库中的
ActionProvider
,因此它的行为可能会有所不同,但您不是每次都在
onPrepareSubMenu
中重新创建子菜单吗?在这里,您可以清除子菜单并重新填充它,以便下次显示子菜单时再次选择默认值。看起来你应该记得上一个选项。@geogemulligan::smacks额头::Spot on。这是“准备”,而不是“创造”。子菜单没有“create”钩子,这可能导致了我的困惑。我仍然得到奇怪的结果(现在一切都检查过了),但这推动了事情的发展。如果你把这个作为回答,我很乐意接受。谢谢六羟甲基三聚氰胺六甲醚。。。我将尝试嵌套菜单方法。再次感谢!是的,嵌套菜单方法有效。我想知道
ActionProvider
中的子菜单内容有什么意义。如果你设置了一个动作视图,你就不能使用它,所以我不知道你仅仅使用嵌套菜单会得到什么好处。无论如何,再次谢谢你!
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/http_stack"
        android:showAsAction="ifRoom"
        android:title="HTTP Stack">
        <menu>
            <group
                android:id="@+id/http_stacks"
                android:checkableBehavior="single">
            <item
                android:id="@+id/hurl"
                android:checkable="true"
                android:checked="true"
                android:title="@string/menu_hurl"/>
            <item
                android:id="@+id/httpclient"
                android:checkable="true"
                android:title="@string/menu_httpclient"/>
            <item
                android:id="@+id/httpclient_tor"
                android:checkable="true"
                android:title="@string/menu_httpclient_tor"/>
            </group>
        </menu>
    </item>
</menu>