Android Spinner - How to position dropdown arrow a

2019-06-16 05:40发布

The options in my spinner has different length and currently the dropdown arrow is positioned far to the right based on the longest option, as shown in the screenshot below.

enter image description here enter image description here

Is it possible to move the dropdown arrow so that it is dynamically positioned based on currently selected option?

Especially when the first option is just 'All', it looks weird when the dropdown arrow is so far away to the right.

Referring to Google Translate App where dropdown arrow is always positioned next to its text: enter image description here enter image description here

3条回答
劫难
2楼-- · 2019-06-16 06:27

Firstly set the background of the Spinner to @null to remove the default triangle:

<Spinner
     android:id="@+id/spinner_main"
     android:spinnerMode="dropdown"
     android:background="@null"
     android:layout_width="wrap_content"
     android:layout_height="match_parent"/>

Then create a layout resource spinner_item_main.xml with only a TextView which we can set a drawable by its right side (you can download the arrow picture from here):

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:textStyle="bold"
    android:gravity="left"
    android:textColor="@color/colorWhite"
    android:drawableRight="@drawable/ic_arrow_drop_down_white_24dp"
    />

Finally Set this layout resource when you initialize the Spinner, You can also provide a resource as the dropdown view (as what I have done):

(I use kotlin)

spinner_main.adapter = ArrayAdapter<String>(this,
            R.layout.spinner_item_main, objects).apply {
        setDropDownViewResource(R.layout.spinner_dropdown_view_main)
    }

Make it! View this in My APP

查看更多
啃猪蹄的小仙女
3楼-- · 2019-06-16 06:27

Translating @尹小雨 answer to java

    ArrayAdapter adapter = new ArrayAdapter<Category>(this,R.layout.spinner_item_main,objects); // creates new ArrayAdapter with custom textviews for all elements including the first one (which is what we want)
    adapter.setDropDownViewResource(R.layout.spinner_dropdown_view_main); // Modifies all the elements when you click on the dropdown
    spinner.setAdapter(adapter); // sets the adapter to the spinner
查看更多
该账号已被封号
4楼-- · 2019-06-16 06:29
1) Set the background of spinner to @null

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

2) In the spinner adapter layout, create an Imageview to the right of           Textview or whatever content is in there
 change the visibility of the imageview to "gone"

3)Override the onItemSelected method of the spinner in your activity,
 in the onItemSelected  method, call the Imageview 
    ImageView downArrow = (ImageView) view.findViewById(R.id.down_arrow);

change its visibility to "visible"
查看更多
登录 后发表回答