0

AppCompatActivity を使用する Android アプリのOPTIONS MENUに「 Spinner」を追加しようとしています。

私が用意した例では、スピナーに「すべて/成功/失敗」などのオプションのドロップダウンリストを表示させたいと考えています。

StackOverflow の他の場所にある手順に従って、スピナーをアクション バーに追加することはできますが、見た目が非常に奇妙です。スピナーをアクション バー アイテムの外観と一致させる必要があります。これは、私の場合、アクション バーのタイトルを白にする必要があることを意味し、スピナーをクリックすると、ポップアップの背景が白になり、テストが黒になる必要があります。オーバーフロー オプション メニュー。

現在取得している外観については、以下のスクリーンショットを参照してください。

折りたたみおよび展開されたスピナー メニュー項目の画像

ご覧のとおり、問題は、アクション バー アイテムの残りの部分が白のときに、スピナーの選択が黒で表示されることです。同様に、スピナーがクリックされると、ドロップダウン内の項目は黒のテキストで暗い背景になり、残りのメニュー項目 (オーバーフロー メニューなど) は黒のテキストで明るい背景になります。

次のようにして、このスピナーを追加しました。

ステップ 1: menu xml にメニュー項目を追加:

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

ステップ 2: 私のアクティビティ (この場合はフラグメント) メニュー拡張コードで、次を追加しました

        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 に答える