web-dev-qa-db-ja.com

Android:スピナーディバイダーのスタイルを設定できません

最初のAndroidアプリのテーマを作成しようとしていますが、それが原因で曲がりくねっています。ドロップダウンリストのアイテムのスタイルを設定する方法をようやく理解できましたが、今はリストアイテム間の仕切りの色を変更できません。stackoverflowで同様の質問を検索し、数十の組み合わせを試しましたが、何も機能しないようです。

これが私のstyles.xmlファイルです(わかりやすくするために省略形):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyTheme" parent="Android:Theme.Light">
    <item name="Android:spinnerStyle">@style/spinnerStyle</item>
    <item name="Android:spinnerDropDownItemStyle">@style/spinnerDropDownItemStyle</item>    
    <item name="Android:dropDownListViewStyle">@style/spinnerListViewStyle</item>
  </style>

  <style name="spinnerStyle" parent="@Android:style/Widget.Spinner">
      <item name="Android:background">@drawable/my_theme_spinner</item>
  </style>

  <style name="spinnerDropDownItemStyle" parent="@Android:style/Widget.DropDownItem.Spinner">
      <item name="Android:background">@drawable/my_theme_spinner_item</item>
      <item name="Android:paddingLeft">5dp</item>
      <item name="Android:gravity">center_vertical</item>
  </style>

  <style name="spinnerListViewStyle" parent="@Android:style/Widget.ListView.DropDown">
      <item name="Android:height">3dp</item>
      <item name="Android:dividerHeight">3dp</item>
      <item name="Android:divider">@color/divider</item>
  </style>
</resources>

私が何をしても、アイテム間に1dpのライトグレーの仕切りが表示されます(明るい色のリストアイテムの背景ではほとんど見えません)-仕切りの高さや色は影響を受けません(私もそれをに設定してみましたドローアブル、これも効果なし)。私は何が間違っているのですか?

13
Russ

私はスピナーで非常に単純なアクティビティを持っています、そしてそれは以下のために働きます。私が見る唯一の違いは、あなたには<item name="Android:height">3dp</item>があり、私にはそれがまったくないということです。

<style name="TestSpinnerStyle" parent="Android:style/Widget.ListView.DropDown">
    <item name="Android:divider">#ff0000</item>
    <item name="Android:dividerHeight">5dp</item>
</style>


<style name="SampleTheme" parent="@Android:style/Theme.Holo.Light">
    <item name="Android:dropDownListViewStyle">@style/TestSpinnerStyle</item>
</style>

そして私の活動では:

    Spinner spinner = (Spinner) findViewById(R.id.spinner);
    List<String> list = new ArrayList<String>();
    list.add("list 1");
    list.add("list 2");
    list.add("list 3");
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            Android.R.layout.simple_spinner_item, list);
    dataAdapter.setDropDownViewResource(Android.R.layout.simple_dropdown_item_1line);
    spinner.setAdapter(dataAdapter);

次に、メインレイアウトに次のXMLがあります。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:orientation="vertical"
              Android:layout_width="fill_parent"
              Android:layout_height="fill_parent"
        >
    <TextView
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:text="Hello World, StylingActivity"
            />
    <Spinner Android:id="@+id/spinner"
             Android:layout_width="250dp"
             Android:layout_height="40dp"
             />
</LinearLayout>

これがスクリーンショットです

sample activity screnshot

そこから機能させることができない場合は、すべてをgithubリポジトリにプッシュすることができます。

25

あなたはあなたのlayout.xmlでそれをすることができます

     <Spinner
                Android:id="@+id/sp_to_create"
                Android:layout_width="match_parent"
                Android:layout_height="32dp"
                Android:layout_marginBottom="10dp"
                style="@style/spinner_style"
                Android:Prompt="@string/to_type_Prompt" />

XMLスタイルで追加

 <style name="spinner_style" parent="Widget.AppCompat.ListView.DropDown">
    <item name="Android:divider">#d1d1d1</item>
    <item name="Android:dividerHeight">0.5dp</item>
</style>

アクティビティテーマに追加

      <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <item name="Android:dropDownListViewStyle">@style/spinner_style</item>
</style>

Javaファイル

your_spinnerList.setAdapter(new ArrayAdapter<>(getActivity(), Android.R.layout.simple_dropdown_item_1line, timeOff_type_list));

それがあなたにとって役に立ったかどうか私に知らせてください!ごきげんよう!

1
Cristofer

使用するドロップダウンレイアウトに水平線を追加すると、効果的に仕切りが作成されます。

[〜#〜]編集[〜#〜]

さらに検索すると、これが見つかりました:

SO回答

これは基本的に、上記で実行しようとしていることは機能するはずだと言っています...activityテーマでそのスタイルを設定することについて言及しており、それを行うことについては言及していません。

1
Barak

受け入れられた回答のスタイルメソッドは、仕切りの色が異なる2つのスピナーが必要になるまでうまく機能します。

これが私が代替として機能することを発見したものです:

a)スピナーのpopupBackgroundColor属性を仕切りに必要な色に設定します。これにより、リストアイテム全体の背景(仕切りと見なされるスペースを含む)が色付けされます。

b)スピナーアダプターdropDownViewResourceをCheckedTextViewに設定し、その背景属性を他の色(または、選択したアイテムの色を変えたい場合はセレクター)に設定します。これにより、仕切り以外のすべてについて、手順aで設定した色が上書きされます。効果的に望ましい結果をもたらします。

だからあなたは持っているでしょう:

drawable/spinner_dropdown_background_selector:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:drawable="@color/your_unchecked_color" Android:state_checked="false"/>
    <item Android:drawable="@color/your_checked_color" Android:state_checked="true"/>
    <item Android:drawable="@color/your_unchecked_color"/>

</selector>

layout/drop_down_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
             Android:id="@Android:id/text1"
             Android:background="@drawable/spinner_dropdown_background_selector"
             Android:textColor="@Android:color/white"
             Android:singleLine="true"
             Android:layout_width="match_parent"
             Android:layout_height="wrap_content"
             Android:ellipsize="Marquee" />

あなたのスピナーの定義:

<Spinner
        ...
        Android:popupBackground="@color/your_divider_color"            
        ...
        />

そして最後に、アレイアダプタの定義:

ArrayAdapter<String> dataAdapter = new ...
dataAdapter.setDropDownViewResource(Android.R.layout.drop_down_item);
spinner.setAdapter(dataAdapter);

スピナーが ダイアログモード の場合、popupBackgroundColorを設定しても効果がないことに注意してください。

0
Oren