web-dev-qa-db-ja.com

Androidスピナーのドロップダウン矢印をテキストの出力に近づける方法

ドロップダウン矢印をSpinnerの放出テキスト要素の近くに設定する必要があります。どうすればこれを達成できますか?

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

enter image description here

14
Ollie Strevel

これを修正するには、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>
12
TheoKanning

これは、選択したスピナーアイテム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);
3
Yash Dhingra

このレイアウトは完璧に役立ちます。

<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>
0
Arun Prajapati