0

我正在尝试在使用 AppCompatActivity 的 Android 应用程序的选项菜单中添加一个“微调器” 。

在我准备的示例中,我希望微调器显示一个选项下拉列表,例如“全部/成功/失败”。

按照 StackOverflow 上其他地方的说明,我可以将微调器添加到操作栏,但它看起来真的很奇怪。我希望微调器与操作栏项目的外观相匹配,在我的情况下,这意味着操作栏上的标题应该是白色的,当我单击微调器时,弹出窗口应该有白色背景和黑色测试,就像溢出选项菜单。

请查看下面的屏幕截图,了解我目前得到的外观。

折叠和展开的微调器菜单项的图像

如您所见,问题是当操作栏项目的其余部分为白色时,微调器选择显示为黑色。同样,当单击微调器时,下拉菜单中的项目具有黑色背景和黑色文本,而其余菜单项(例如溢出菜单)具有浅色背景和黑色文本。

我通过执行以下操作添加了这个微调器:

第 1 步:在菜单 xml 中添加菜单项

 <item android:id="@+id/spinner"
      app:showAsAction="always"
      android:title="Filter"
      app:actionViewClass="android.widget.Spinner" />

第 2 步:在我的 Activity(在本例中为 Fragment)菜单扩展代码中,添加以下内容

        String [] adapterValues = new String[]{"All", "Successful", "Failed"};
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, adapterValues);

    MenuItem item = menu.findItem(R.id.spinner);

    Spinner spinner = (Spinner) MenuItemCompat.getActionView(item);
    spinner.setAdapter(adapter); 

解决方案尝试

所以在我的数组适配器中,我没有使用默认的微调器布局,而是创建并提供了我的所有者布局,如下所示:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.actionbar_spinner_filter, R.id.spinner_text, adapterValues);

而对应的布局文件为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:padding="16dp"
     android:background="@android:color/white"
>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/spinner_text"
    />

</LinearLayout>

这给了我以下结果,正如你所看到的,这些结果很奇怪。

折叠和展开的微调器菜单的图像

问题摘要

  1. 这是向我的 AppCompatActivity 添加选项菜单以获得“下拉菜单”效果的最佳方式吗?
  2. 什么是我可以用来确保微调菜单的外观在折叠时与操作栏匹配的最佳方法是什么,当它展开时,它与操作栏中其余弹出项目的描述相匹配(例如溢出菜单) ?

谢谢

4

1 回答 1

1

在您的菜单 xml 文件中执行以下操作:

<?xml version="1.0" encoding="utf-8"?>
<menu 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app.polar="http://schemas.android.com/apk/res-auto">
    <item 
        android:id="@+id/item0" 
        app.polar:showAsAction="always" 
        android:icon="@drawable/some_icon" 
        android:title="@string/some_title"/>
    <item
        android:id="@+id/item1"
        app.polar:showAsAction="always"
        android:icon="@drawable/some_icon"
        android:title="@string/some_title">
        <menu
            android:id="@+id/submenu1">
            <item
                android:id="@+id/item11"
                app.polar:showAsAction="never"
                android:title="@string/some_submenu_title"/>
            <item
                android:id="@+id/item12"
                app.polar:showAsAction="never"
                android:title="@string/some_submenu_title"/>
            <item
                android:id="@+id/item13"
                app.polar:showAsAction="never"
                android:title="@string/some_submenu_title"/>
            </menu>
        </item>
    </menu>

在您的活动中执行以下操作:

public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.yourmenu, menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case R.id.item0:{
            //do something
            return true;
        }
        case R.id.item11:{
            //do something
            return true;
        }
        case R.id.item12:{
            //do something
            return true;
        }
        case R.id.item13:{
            //do something
            return true;
        }
    }
    return super.onOptionsItemSelected(item);
}

如果您这样做,您的子菜单的样式将始终与正常的操作栏溢出菜单相同。

于 2015-10-14T17:24:10.317 回答