13

初めての 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>

何をしても、アイテム間に 1 dp の明るい灰色の仕切りが表示されます (明るい色のリスト項目の背景ではほとんど見えません)。仕切りの高さや色は影響を受けません (また、描画可能、効果なし)。私は何を間違っていますか?

4

4 に答える 4

25

スピナーを使用した非常に単純なアクティビティがあり、次のように機能します。私が見る唯一の違いは、あなたにはそれがあり<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>

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

サンプル アクティビティのスクリーンショット

そこから動かない場合は、すべてを github リポジトリにプッシュできます。

于 2012-10-30T17:15:56.040 に答える
1

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

編集

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

SO回答

これは基本的に、あなたが上でやろうとしていることを示すことはうまくいくはずだと言っています...それはあなたの活動テーマでそのスタイルを設定することを述べています、そしてあなたはそれをすることについて言及していません。

于 2012-06-06T14:58:39.167 に答える
0

受け入れられた回答のスタイル メソッドは、仕切りの色が異なる 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>

レイアウト/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 を設定しても効果がないことに注意してください。

于 2015-05-27T08:14:53.307 に答える