2

Android 2.2では、ActionBarのスピナーは非常に見苦しく、ドロップダウンテキストの色は背景色と同じです。これにより、テキストが読めなくなります。

ここに画像の説明を入力してください

関連するコードは次のとおりです。

spinner = new Spinner(getSupportActionBar().getThemedContext());
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>
(
    getSupportActionBar().getThemedContext(), 
    R.layout.sherlock_spinner_dropdown_item, 
    new String[]{"All", "Solved", "Unsolved"}
);
spinner.setAdapter(spinnerArrayAdapter);

Edit: I have added the below 3 lines for completeness.

menu.add("Display")
    .setActionView(spinner)
    .setShowAsAction(MenuItem.Show_AS_ACTION_ALWAYS);

Android4.2では次のようになります。これは、Android2.2でも同じように見えると私が予想したものです。

ここに画像の説明を入力してください

4

4 に答える 4

4

を作成するときは、 ;SpinnerArrayAdapterを使用する必要があります。次に、アダプタR.layout.sherlock_spinner_itemを呼び出す必要があります。setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item)2つのリソース名の違いに注意してください。

サンプルコードから:

Context context = getSupportActionBar().getThemedContext();
ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(context, R.array.locations, R.layout.sherlock_spinner_item);
list.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);

あなたのコードの場合、これは次のようになります。

spinner = new Spinner(getSupportActionBar().getThemedContext());
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>
(
    getSupportActionBar().getThemedContext(), 
    R.layout.sherlock_spinner_item, 
    new String[]{"All", "Solved", "Unsolved"}
);
spinnerArrayAdapter.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);
spinner.setAdapter(spinnerArrayAdapter);
于 2012-11-30T00:51:59.837 に答える
3

MenuItemでICSスタイルのスピナーを使用するソリューションを作成しました。AndroidサポートライブラリにはSpinnerICSウィジェットがあり、リストナビゲーションモードで使用されますが、直接使用できないように内部化することにしました。私の解決策は、リフレクションを介してSpinnerICSウィジェットにアクセスすることです。

最初にSpinnerICS.javaを作成します。

package com.example.widget;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;

public class SpinnerICS 
{
    private Spinner spinner = null;
    private View spinnerICS = null;
    private Method setAdapterICS = null;
    private Method setSelectionICS = null;
    private Method getAdapterICS = null;
    private Method getSelectedItemPositionICS = null;
    private Method getSelectedItemICS = null;
    private Class<?> OnItemSelectedListenerICS = null;
    private Method setOnItemSelectedListenerICS = null;

    public SpinnerICS(Context context)
    {
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            try {
                Class<?> c = Class.forName("android.support.v7.internal.widget.SpinnerICS");            
                Constructor<?> ctor = c.getDeclaredConstructor(Context.class, AttributeSet.class, int.class);
                ctor.setAccessible(true);
                setAdapterICS = c.getMethod("setAdapter", SpinnerAdapter.class);
                setSelectionICS = c.getMethod("setSelection", int.class);
                getAdapterICS = c.getMethod("getAdapter");
                getSelectedItemPositionICS = c.getMethod("getSelectedItemPosition");
                getSelectedItemICS = c.getMethod("getSelectedItem");
                OnItemSelectedListenerICS = Class.forName("android.support.v7.internal.widget.AdapterViewICS$OnItemSelectedListener");
                setOnItemSelectedListenerICS = c.getMethod("setOnItemSelectedListener", OnItemSelectedListenerICS);             
                spinnerICS = (View)ctor.newInstance(context, null, android.support.v7.appcompat.R.attr.actionDropDownStyle);                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (spinnerICS == null) {
            spinner = new Spinner(context);
        }
    }

    public View getView()
    {
        return (spinnerICS != null ? spinnerICS : spinner);
    }

    public void setAdapter(SpinnerAdapter adapter)
    {
        if (spinnerICS != null) {
            try {
                setAdapterICS.invoke(spinnerICS, adapter);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (spinner != null) {
            spinner.setAdapter(adapter);
        }
    }

    public void setSelection(int position)
    {
        if (spinnerICS != null) {
            try {
                setSelectionICS.invoke(spinnerICS, position);
            } catch (Exception e) {
                e.printStackTrace();
            }           
        } else if (spinner != null) {
            spinner.setSelection(position);
        }
    }

    public SpinnerAdapter getAdapter()
    {
        if (spinnerICS != null) {
            try {
                return (SpinnerAdapter)getAdapterICS.invoke(spinnerICS);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (spinner != null) {
            return spinner.getAdapter();
        }
        return null;
    }

    public int getSelectedItemPosition()
    {
        if (spinnerICS != null) {
            try {
                return (Integer)getSelectedItemPositionICS.invoke(spinnerICS);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (spinner != null) {
            return spinner.getSelectedItemPosition();
        }
        return -1;
    }

    public Object getSelectedItem()
    {
        if (spinnerICS != null) {
            try {
                return getSelectedItemICS.invoke(spinnerICS);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (spinner != null) {
            return spinner.getSelectedItem();
        }
        return null;        
    }

    public class OnItemSelectedListenerProxyListener implements java.lang.reflect.InvocationHandler
    {
        private OnItemSelectedListener listener;

        public OnItemSelectedListenerProxyListener(OnItemSelectedListener listener)
        {
            this.listener = listener; 
        }    

        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {
            if (method.getName().equals("onItemSelected")) {
                listener.onItemSelected(null, (View)args[1], (Integer)args[2], (Long)args[3]);
            } else if (method.getName().equals("onNothingSelected")) {
                listener.onNothingSelected(null);
            }
            return null;
        }
    }


    public void setOnItemSelectedListener(OnItemSelectedListener listener)
    {
        if (spinnerICS != null) {
            try {               
                Object obj = Proxy.newProxyInstance(OnItemSelectedListenerICS.getClassLoader(), new Class<?>[] { OnItemSelectedListenerICS } , new OnItemSelectedListenerProxyListener(listener));
                setOnItemSelectedListenerICS.invoke(spinnerICS, obj);
            } catch (Exception e) {
                e.printStackTrace();
            }           
        } else if (spinner != null) {
            spinner.setOnItemSelectedListener(listener);
        }
    }   
}

次に、このSpinnerICSを次のように使用します。

    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        String[] items = new String[] { "one", "two", "three" };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.support.v7.appcompat.R.layout.support_simple_spinner_dropdown_item, items);
        adapter.setDropDownViewResource(android.support.v7.appcompat.R.layout.support_simple_spinner_dropdown_item);

        SpinnerICS spinner = new SpinnerICS(this);
        MenuItem item = menu.add("Sample:");
        MenuItemCompat.setActionView(item, spinner.getView());
        MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
        spinner.setAdapter(adapter);

        return true;
    }
于 2014-01-17T14:03:42.503 に答える
0

上記の答えに追加するだけです。完全に機能しますが、コンテキストを以下のようなテーマのコンテキストに設定する必要があります。

Context ctx = getSupportActionBar().getThemedContext();

そうしないと、テーマが一致しません。

于 2014-05-19T12:10:55.180 に答える
0

SpinnerICSソリューションは示されているようにうまく機能しますが、それを使用することは通常のSpinnerとは少し異なります。

たとえば、次のことはできません。

xmlの場合:

<TableRow>
<TextView android:text="@string/textview_abc" 
    android:layout_width="80sp"
    android:gravity="center"
    android:inputType="textMultiLine"
/>
<SpinnerICS android:id="@+id/spinner_abc"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="14sp"
    android:prompt="@string/spinner_abc"
/>
</TableRow>

Javaの場合:

SpinnerICS spinner = (SpinnerICS) view.findViewById(R.id.spinner_abc);

次のようなエラーが発生します。

[javac] /home/androidin/build/Project/src/com/example/FragmentTab.java:77: error: inconvertible types
[javac]         SpinnerICS spinner = (SpinnerICS) view.findViewById(R.id.spinner_abc);
[javac]                                                                                                                              ^
[javac]   required: SpinnerICS
[javac]   found:    View
于 2014-07-17T23:03:57.310 に答える