如何将Android Spinner下拉箭头移动到其显示文本更近的位置?

17

我需要将下拉箭头与 Spinner 元素中的文本更靠近一些。如何实现这一点?

<Spinner android:id="@+id/spinner"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content" />

在这里输入图片描述

4个回答

12
你可以通过在xml中定义自定义背景,然后设置箭头的右边距来解决这个问题。
首先,定义一个图层列表,其中包括一个矩形背景和一个位图对象作为箭头。通过设置箭头的gravity属性,可以使箭头在右侧居中对齐。通过android:"right"属性设置箭头的右侧边缘位置,可以将其向中心移动。请注意,这不会根据文本的长度动态移动箭头,但这应该是有帮助的第一步。 spinner_background.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/color_white" />
            <corners android:radius="2.5dp" />
        </shape>
    </item>
    <item android:right="64dp">
         <bitmap 
             android:gravity="right|center_vertical"  
             android:src="@drawable/ic_spinner" />
    </item>
</layer-list>

3
可能感兴趣的两个方面如下:1.在android:src="@drawable/ic_spinner"后缺少一个闭合括号(>)。2.spinner_background.xml需要在drawable文件夹中创建。 - XerXes
1
这导致了错误 "Caused by: android.view.InflateException: Binary XML file line #277"。 - VanessaF

4
这可以通过创建一个自定义布局来实现,用于所选的下拉列表项 custom_spinner_item.xml。我添加了一个TextView,用于显示当前选定的下拉列表项。箭头图标添加在ImageView中。您可以使用任何图标。箭头图标根据文本长度移动,这不是TheoKanning答案所能实现的。实际上,您可以完全修改此布局中下拉列表的外观。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/spinner_item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"/>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:src="@mipmap/ic_arrow_down"/>
</LinearLayout>

创建自定义的下拉框适配器并填充上述视图。同时通过覆盖默认的getView()方法设置您列表中所选下拉框项的文本。
public class CustomSpinnerAdapter extends ArrayAdapter<String> {
    LayoutInflater inflater;
    List<String> spinnerItems;

    public CustomSpinnerAdapter(Context applicationContext, int resource, List<String> spinnerItems) {
        super(applicationContext, resource, spinnerItems);
        this.spinnerItems = spinnerItems;
        inflater = (LayoutInflater.from(applicationContext));
    }
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        view = inflater.inflate(R.layout.custom_spinner_item, null);
        TextView type = (TextView) view.findViewById(R.id.spinner_item_text);
        type.setText(spinnerItems.get(i));
        return view;
    }
}

然后实例化CustomSpinnerAdapter类并将其设置为您的spinner的适配器。 spinnerList是要在spinner中显示的项目列表。
CustomSpinnerAdapter customSpinnerAdapter = new CustomSpinnerAdapter(getContext(), android.R.layout.simple_spinner_item, spinnerList);
spinner.setAdapter(customSpinnerAdapter);

它在CustomSpinnerAdapter中的getView()方法中使用,用于创建视图 - "view = inflater.inflate(R.layout.custom_spinner_item, null);" - Yash Dhingra
你遇到了什么问题?@ParamjitSinghRana - Yash Dhingra
这对我有用。但是图标(下拉箭头)右侧存在某种填充或边距。https://i.imgur.com/IYRU35y.png如何摆脱它? - LuckMan
@LuckMan:可能是父布局的问题。尝试更改不同布局的背景颜色,以确定哪个布局有额外的空间。 - Yash Dhingra
我通过添加android:background属性并将其设置为透明(其他颜色也可以)来修复了它。顺便问一下,有没有办法自定义下拉项的样式?我想要与我的应用程序主题相匹配。目前,它正在使用默认样式:https://i.imgur.com/sWN4B21.png 编辑:没关系,setDropDownViewResource解决了问题。 :) - LuckMan

1
请按照这段代码操作,它将满足您的需求。我也进行了大量的研究来满足我的需求,这与您的需求相同。
因此,请根据您的需要调整填充:
<Spinner android:id="@+id/spinner"    
  android:layout_width="wrap_content"    
  android:layout_height="wrap_content"    
  android:gravity="end"    
  android:paddingEnd="30dp"    
/>

-3

这个布局将会完美地帮助你。

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/dp5"
    android:background="@drawable/squre_gray_bg"
    android:paddingRight="@dimen/dp10">

    <Spinner
        android:id="@+id/ed_project_start"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp40"
        android:layout_marginTop="@dimen/dp5"
        android:textColor="@color/colorDarkGray" />
</FrameLayout>

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