【问题标题】:How to add left drawable in Spinner View in Android如何在 Android 的 Spinner 视图中添加左可绘制对象
【发布时间】:2014-05-12 12:38:43
【问题描述】:

您好,我正在尝试在 Spinner 中添加左可绘制对象,但我没有找到任何属性,就像您在 EditText 中使用 android:drawableLeft="@drawable/password_drawable" 所做的一样。是否有任何正确的方法可以在 Android 中的 Spinner 中实现相同的目标。

在我的情况下,应该只保留我在屏幕截图中给出的这种状态,当用户单击 Spinner 时,我不想在 Spinner 的打开下拉列表中留下可绘制状态

我正在尝试这样,没有这样的属性

<Spinner
    android:id="@+id/selectSpinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/sign_up_views_vertical_top_margin"
    android:background="@drawable/edittext_border"
     />

我想要下面的截图

目前如下图所示

当我设置 Spinner 的背景时,它看起来像

<Spinner
    android:id="@+id/selectSpinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/sign_up_views_vertical_top_margin"
    android:background="@drawable/selectone_drawable"
    android:entries="@array/select_type" />

提前致谢

【问题讨论】:

  • 您可以设置微调器的背景。 android:background="@drawable/your_drawable"
  • @Sripathi 它没有用,设置背景不是 IMO 的一种方式,因为它将这个背景图像设置在完整的微调器上
  • 现在您将箭头块单独设置为背景右(该框包含一个向下箭头)?使用九个补丁,否则您可以将您的 png 图像更改为左端有一个正方形的框(如 edittext)(您想要的微调器布局)。

标签: android android-layout android-spinner


【解决方案1】:

创建一个可绘制的 xml @drawable/gradient_spinner `

<?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="@color/myTextPrimaryColor" android:startColor="@color/myTextPrimaryColor" android:type="linear" />

            <stroke android:width="1dp" android:color="@color/bg_eo" />

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

            <padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" />
        </shape></item>
        <item ><bitmap android:gravity="right|center" android:src="@drawable/expnd" />
        </item>
    </layer-list></item>

</selector> `

设置微调器背景 android:background="@drawable/gradient_spinner"

【讨论】:

  • 谢谢!在将重力更改为left|center 后,这对我有用。 :)
【解决方案2】:

创建一个九补丁图像并将其设置为 Spinner 的背景,然后添加一个左侧填充,应该可以解决问题。

【讨论】:

  • 不,它对我不起作用,请参阅我更新的问题我添加了屏幕截图
  • 创建九个补丁图像并将其设置为背景。那么它应该可以工作了。
  • 我回家后会为你做,现在不能在工作中做。或者你可以尝试自己做一些关于九个补丁图像的研究,它在任何 Android 项目中都非常有用:)
  • 最棒的是,您可以在不拉伸图像的情况下为微调器指定任意宽度。
  • 是的,这是九个补丁可绘制的优势,不错的概念
【解决方案3】:

dummy.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <layer-list android:opacity="transparent">
            <item android:gravity="left" android:width="100dp" 
            android:end="300dp">
                <shape>
                    <solid android:color="#269cf7">

                    </solid>
                </shape>
            </item>
            <item android:gravity="right" android:width="300dp" android:start="100dp">
                <shape>
                    <solid android:color="@color/transparent">

                    </solid>
                </shape>
            </item>
            <item android:width="100dp" android:end="300dp">
                <bitmap android:src="@drawable/arrow_bottom" android:gravity="center"/>
            </item>
        </layer-list>
    </item>
</selector>

在布局文件中添加此代码

<android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardUseCompatPadding="true"
        app:cardElevation="5dp">
     <Spinner
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@drawable/dummy">

     </Spinner>
    </android.support.v7.widget.CardView>

【讨论】:

  • 谢谢你.. 这工作得很好。我不知道为什么上面的正确答案写了9个补丁文件??
  • 有人需要提到你需要为上面的 dummy.xml 使用 png 而不是矢量可绘制对象。
【解决方案4】:

试试这个,

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
           if(view!=null) {
               ((TextView) view).setPadding(0, 0, 0, 0);//remove extra padding
               ((TextView)view) .setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(context, R.drawable.your_image), null, null, null);
               ((TextView) view).setCompoundDrawablePadding(20);// to set drawablePadding
           }
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

【讨论】:

    【解决方案5】:

    正如马克所说,您应该将以下图像作为微调器的背景并采取所需的左填充,以便文本将在箭头图像之后。

    以下是一些代码,可以让您了解更多;)

    <Spinner
        android:id="@+id/selectSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/sign_up_views_vertical_top_margin"
        android:background="@drawable/the_attached_drawable"
        android:paddingLeft="@dimen/required_padding_for_each_screen_size"
        android:entries="@array/select_type" />
    

    【讨论】:

      【解决方案6】:

      最简单的解决方案是创建一个LinearLayout 包装spinner,然后以您想要的方式更改LinearLayout,例如,在水平布局中使用ImageViewSpinner。这样用户会看到一个Spinner,左侧有一张图片。

      我只能通过这种方式实现。简单且最佳的 IMO 解决方案。

      【讨论】: