【问题标题】:How to move the Android Spinner drop down arrow closer to it's emitting text如何将 Android Spinner 下拉箭头移近它正在发出的文本
【发布时间】:2015-12-16 21:10:14
【问题描述】:

我需要将下拉箭头设置为更靠近Spinner 中的发射文本元素。如何做到这一点?

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

【问题讨论】:

    标签: android spinner android-spinner


    【解决方案1】:

    您可以通过在 xml 中定义自定义背景,然后从右侧设置箭头的边距来解决此问题。

    首先为您的箭头定义一个带有矩形背景和位图对象的图层列表。您可以通过设置其重力使箭头与右侧中心对齐,您可以通过 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>
    

    【讨论】:

    • 以下两个方面可能会感兴趣: 1. android:src="@drawable/ic_spinner" 后面缺少一个右括号(>)。 2.需要在drawable文件夹下创建spinner_background.xml。
    【解决方案2】:

    这可以通过为选定的微调器项 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 类并将其设置为微调器的适配器。 spinnerList 是要在微调器中显示的项目列表。

    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);"
    • 您面临什么问题? @ParamjitSinghRana
    • 这对我有用。但是图标右侧有某种填充或边距(下拉箭头)。 i.imgur.com/IYRU35y.png如何摆脱它?
    • @LuckMan:可能是父布局的问题。尝试更改不同布局的背景颜色,以确定哪个布局具有额外空间。
    • 我设法通过添加android:background 属性并使其透明(其他颜色也可以)来修复它。顺便问一下,有没有办法自定义下拉项样式?我想将它与我的应用主题相匹配。目前,它使用默认样式:i.imgur.com/sWN4B21.png 编辑:没关系,setDropDownViewResource 成功了。 :)
    【解决方案3】:

    请遵循此代码,这将满足您的要求。我也做了太多的研究来满足我和你一样的要求。

    所以,根据需要调整填充:

    <Spinner android:id="@+id/spinner"    
      android:layout_width="wrap_content"    
      android:layout_height="wrap_content"    
      android:gravity="end"    
      android:paddingEnd="30dp"    
    />
    

    【讨论】:

      【解决方案4】:

      这种布局会为您提供完美的帮助。

      <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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 2015-08-15
        • 2015-11-16
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        相关资源
        最近更新 更多