旋转下拉箭头

7
我正在尝试获取一个自定义的Spinner,就像这个:

但我只能得到这个:

enter image description here

如您所见,我遇到了几个问题。

  1. 尽管我添加了自定义箭头,但仍然看到原始箭头。
  2. 我的自定义箭头在每一行都显示。
  3. 如何调整自定义箭头的尺寸和布局位置?
  4. 如何生成带下划线的行?

这是我的代码:

onCreateView()

Spinner spinner = (Spinner) rootView.findViewById(R.id.spinner);
this.arraySpinner = new String[]{
    "Seleziona una data",
    "03 Agosto 2015",
    "13 Giugno 2015",
    "27 Novembre 2015",
    "30 Dicembre 2015",
};
ArrayAdapter<String> adapter = new ArrayAdapter<>(
        getActivity(),
        R.layout.row_spinner,
        R.id.weekofday,
        arraySpinner);

spinner.setAdapter(adapter);

res/layout/row_spinner.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="8dp">

    <TextView android:id="@+id/weekofday"
        android:singleLine="true"
        android:textSize="@dimen/textSize"
        style="@style/SpinnerDropdown"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <ImageView android:id="@+id/icon"
        android:paddingStart="8dp"
        android:paddingLeft="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/spinner_arrow"/>

</LinearLayout>

编辑

我已经移除了 ImageView,并添加了一个从资源创建的第二个 Spinner

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
        getActivity(),
        R.array.date,
        R.layout.spinner_layout);
spinnerDate.setAdapter(adapter);

Spinner spinnerTime = (Spinner) rootView.findViewById(R.id.spinnerTime);
ArrayAdapter<CharSequence> adapterTime = ArrayAdapter.createFromResource(
        getActivity(),
        R.array.ore,
        R.layout.spinner_layout);
spinnerTime.setAdapter(adapterTime);

使用这个布局:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:padding="8dp"
    android:singleLine="true"
    android:layout_height="wrap_content" android:layout_width="match_parent"/>

我已将此添加到我的style.xml:
<style name="AppTheme" parent="@style/_AppTheme"/>
<!-- Base application theme. -->
<style name="_AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:dropDownSpinnerStyle">@style/SpinnerTheme   </item>

    <item name="android:windowActionBarOverlay">false</item>
    <item name="colorPrimary">@color/ColorPrimary</item>
    <item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
</style>

....
.... 
....

<!--Spinner styles 2-->
<style name="SpinnerTheme" parent="android:Widget.Spinner">
    <item name="android:background">@drawable/apptheme_spinner_background_holo_light</item>
    <item name="android:dropDownSelector">@drawable/apptheme_list_selector_holo_light</item>
</style>

<style name="SpinnerTheme.DropDown">
    <item name="android:spinnerMode">dropdown</item>
</style>

<!-- Changes the spinner drop down item radio button style -->
<style name="DropDownItemSpinnerTheme" parent="android:Widget.DropDownItem.Spinner">
    <item name="android:checkMark">@drawable/apptheme_btn_radio_holo_light</item>
</style>

<style name="ListViewSpinnerTheme" parent="android:Widget.ListView">
    <item name="android:listSelector">@drawable/apptheme_list_selector_holo_light</item>
</style>

<style name="ListViewSpinnerTheme.White" parent="android:Widget.ListView.White">
    <item name="android:listSelector">@drawable/apptheme_list_selector_holo_light</item>
</style>

<style name="SpinnerItemTheme"
    parent="android:TextAppearance.Widget.TextView.SpinnerItem">
    <item name="android:textColor">#000000</item>
</style>

但是没有结果!我仍然看到这个:

enter image description here

我已将style.xml更改为:

http://pastie.org/private/es40xgebcajajltksyeow

这就是我得到的:

enter image description here

现在,我不仅有一个下拉箭头图标,还有第二个图标,即全选复选框(它工作正常,在我选择一项时被选中),但是,我如何只获取我想要的那个?

manifest.xml:

http://pastie.org/private/tu0izusbvvxe91lwmh9vnw

2个回答

10
你需要将Imageview从你的自定义布局文件row_spinner.xml中删除。如果你不需要在自定义布局中创建一个箭头,那么就不用这么做,因为如果这样做,每一行都会创建一个箭头,就像你遇到的问题一样。要实现你所展示的效果,你必须将Spinner的样式更改为你的styles.xml中的样式。

例如:

<resources>

    <style name="SpinnerTheme" parent="android:Widget.Spinner">
        <item name="android:background">@drawable/spinner_background_holo_light</item>
        <item name="android:dropDownSelector">@drawable/list_selector_holo_light</item>
    </style>

    <style name="SpinnerTheme.DropDown">
        <item name="android:spinnerMode">dropdown</item>
    </style>

    <!-- Changes the spinner drop down item radio button style -->
    <style name="DropDownItemSpinnerTheme" parent="android:Widget.DropDownItem.Spinner">
        <item name="android:checkMark">@drawable/btn_radio_holo_light</item>
    </style>

    <style name="ListViewSpinnerTheme" parent="android:Widget.ListView">
        <item name="android:listSelector">@drawable/list_selector_holo_light</item>
    </style>

    <style name="ListViewSpinnerTheme.White" parent="android:Widget.ListView.White">
        <item name="android:listSelector">@drawable/list_selector_holo_light</item>
    </style>

    <style name="SpinnerItemTheme" 
            parent="android:TextAppearance.Widget.TextView.SpinnerItem">
        <item name="android:textColor">#000000</item>
    </style>

</resources>

如需更多信息,请查看:http://androidopentutorials.com/android-how-to-get-holo-spinner-theme-in-android-2-x/

编辑

selector_spinner.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item>

        <layer-list>

            <item>
                <shape>
                    <gradient android:angle="90" android:endColor="#ffffff" android:startColor="#ffffff" android:type="linear" />

                    <stroke android:width="1dp" android:color="#504a4b" />

                    <corners android:radius="5dp" />

                    <padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" />
                </shape>
            </item>

            <item>

                <bitmap android:gravity="bottom|right" android:src="@android:drawable/arrow_up_float" />

            </item>

        </layer-list>

    </item>

</selector>

样式.xml:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <item name="android:spinnerStyle">@style/SpinnerTheme</item>
    </style>

    <style name="SpinnerTheme" parent="android:Widget.Spinner">
        <item name="android:background">@drawable/selector_spinner</item>
    </style>

</resources>

最终,旋转器将看起来像这样 enter image description here

编辑2

以下代码位于 details_fragment_three.xml

<Spinner
    android:id="@+id/spinnerDate"
    android:layout_marginLeft="-8dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/spinner_item_drawable"/> 

1
@CrisBenois,请看一下:https://dev59.com/yV8f5IYBdhLWcg3wHPeN - Clayton Oliveira
完成。但是我仍然看到旧的箭头。在我添加这些样式和我的箭头图标之后,如何应用“SpinnerTheme”? - Cris
你不需要应用主题,因为该主题已经应用于每个父组件为Spinner的组件上,如此部分<style name="SpinnerTheme" parent="android:Widget.Spinner">。你从自定义布局中删除了ImageView吗? - Lennon Spirlandelli
1
根据我在你的代码中所看到的,你只是使用了SpinnerTheme而没有使用其他的主题。我发布的代码只是一个例子,所以你需要改变几乎一切。无论如何,我在我的应用程序中测试了一些代码,并且它完美地工作了。看看我的修改,并记住它只是一个例子,你必须进行相应的适应。 - Lennon Spirlandelli
1
抱歉,伙计,让你等了这么久。我不知道你的项目出了什么问题。我尝试了我所知道的所有方法来获取“spinner”的样式,但都没有成功。然而,我尝试在“details_fragment_three.xml”中的每个“spinner”代码中添加“android:background="@drawable/spinner_item_drawable"”,它完美地解决了问题。因此,你不需要在“style”中做任何事情。请查看我的编辑答案,并查看代码的那一部分现在是什么样子。 - Lennon Spirlandelli
显示剩余11条评论

-1

您可以使用自己的下拉图片;

        <item>

            <layer-list>

                <item>
                    <color android:color="@android:color/white" />
                </item>

                <item>
                    <bitmap android:gravity="center_vertical|right" android:src="@drawable/down_arrow" /> // down_arrow replace your image
                </item>

            </layer-list>

        </item>

    </selector>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接