Android:使ActionBar中的Spinner具有与Action Bar项

时间:2015-10-14 03:48:06

标签: android android-actionbar spinner dropdown appcompatactivity

我正在尝试添加' Spinner '在我的Android App中使用AppCompatActivity的 OPTIONS MENU 中。

在我准备的示例中,我希望微调器提供下拉列表选项列表,例如'全部/成功/失败'。

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

请参阅下面的截图,了解我目前的外观。

Image of collapsed and expanded spinner menu item

正如您所看到的,问题是当操作栏项的其余部分为白色时,微调器选择显示为黑色。类似地,当单击微调器时,下拉列表中的项目具有带黑色文本的深色背景,而其余菜单项(例如溢出菜单)具有带黑色文本的浅色背景。

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

步骤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>

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

Image of collapsed and expanded spinner menu

问题摘要

  1. 这是将选项菜单添加到我的AppCompatActivity以获得“下拉菜单”的最佳方式。效果
  2. 我可以使用哪种方法来确保微调器菜单的外观在折叠后与操作栏匹配,并且当它被展开时,它与弹出窗口其余部分的描述相匹配操作栏中的项目(例如溢出菜单)?
  3. 由于

1 个答案:

答案 0 :(得分: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);
}

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