web-dev-qa-db-ja.com

スピナードロップダウンアイコンの変更

私が見つけた解決策は、スピナーのドロップダウンアイコンを変更することです:

1。カスタムドローアブルを作成します

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/vector_drawable_ic_dropdown_black" Android:state_focused="true" Android:state_pressed="false" />
    <item Android:drawable="@drawable/vector_drawable_ic_dropdown_black" Android:state_focused="true" Android:state_pressed="true" />
    <item Android:drawable="@drawable/vector_drawable_ic_dropdown_black" Android:state_focused="false" Android:state_pressed="true" />
    <item Android:drawable="@drawable/vector_drawable_ic_dropdown_black" />
</selector>

2。ドロアブルをスピナーの背景として設定します:

<Spinner
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="16dp"
    Android:background="@drawable/custom_spinner_icon"
    Android:gravity="center"
    Android:paddingBottom="8dp"
    Android:paddingTop="8dp"
    Android:textColor="@color/textcolorprimary" />

結果は次のとおりです。

enter image description here

ご覧のとおり、アイコンは右揃えにする必要があり、伸びないようにする必要があるため、これは許容できる解決策ではありません。

アイコンを伸縮させずに正しく整列させるにはどうすればよいですか?

編集

まだ有効な解決策がないため、質問を指定する必要があります。これは、標準テーマを使用したSpinnerの外観です。

<Spinner
    Android:id="@+id/products_download_spinner_language"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="16dp"
    Android:gravity="center"
    Android:paddingBottom="8dp"
    Android:paddingTop="8dp"
    Android:textColor="@color/textcolorprimary"
    Android:theme="@Android:style/Theme.Holo.Light.DarkActionBar" />

enter image description here

そして、私が望むすべて(実際にはそれほど多くはないと思います)は矢印を変更しています。私は右下隅にある矢印を表示したくない、私はこの矢印を右の垂直中央に表示したい:

enter image description here

そして、私が今まで試したすべてのソリューション:

スピナードロップダウン矢印

スピナーでドロップダウン矢印を設定する方法?

単に働いていませんでした。彼らはアイコンを伸ばしていたか、一番下の行が欠落していたか、何か他のものが完全に間違っていました。別の矢印が欲しいだけです。

37
Mulgard

次のスタイルをスピナーに適用してみてください

style="@style/SpinnerTheme"

// スピナースタイル

<style name="SpinnerTheme" parent="Android:Widget.Spinner">
    <item name="Android:background">@drawable/bg_spinner</item>
</style>

//bg_spinner.xml arrow_down_grayを矢印に置き換えます

<?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="#ffffff" Android:startColor="#ffffff" Android:type="linear" />

                    <stroke Android:width="0.33dp" Android:color="#0fb1fa" />

                    <corners Android:radius="0dp" />

                    <padding Android:bottom="3dp" Android:left="3dp" Android:right="3dp" Android:top="3dp" />
                </shape>
            </item>

            <item Android:right="5dp">

                <bitmap Android:gravity="center_vertical|right" Android:src="@drawable/arrow_down_gray" />

            </item>

        </layer-list>

    </item>

</selector>
91
Pehlaj

これには、。9 Patch Imageを使用し、単にバックグラウンドに設定するだけです。

Android:background="@drawable/spin"

ここでは、.9patchイメージを提供します。これで試してください。

enter image description hereenter image description here

画像を右クリックし、[名前を付けて画像を保存]をクリックします

次のように画像名を設定します:anyname.9.pngそして保存をクリックします。

楽しんでください。 :)

15
Ronak Selarka

スピナーにテーマを追加

<Spinner style="@style/SpinnerTheme"
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"/>

SpinsThemeをstyles.xmlに追加します

<style name="SpinnerTheme" parent="Android:Widget.Spinner">
    <item name="Android:background">@drawable/spinner_background</item>
</style>

New-> "Vector Asset"を追加して、例えば「ic_keyboard_arrow_down_24dp」

Spinner_background.xmlをdrawableに追加します

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <layer-list>
            <item Android:drawable="@drawable/ic_keyboard_arrow_down_24dp" Android:gravity="center_vertical|right" Android:right="5dp"/>
        </layer-list>
    </item>
</selector>
8
Moshood Awari

次のようなカスタム背景を作成する必要があります。

<?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="#ffffff" Android:startColor="#ffffff" Android:type="linear"/>

                    <stroke Android:width="1dp" Android:color="#504a4b"/>

                    <corners Android:radius="5dp"/>

                    <padding Android:bottom="3dp" Android:left="3dp" Android:right="3dp" Android:top="3dp"/>
                </shape>
            </item>
            <item>
                <bitmap Android:gravity="bottom|right" Android:src="@drawable/drop_down"/> // you can place your dropdown image
            </item>
        </layer-list>
    </item>

</selector>

次に、スピナー用にstyleを作成します:

<style name="spinner_style">
        <item name="Android:background">@drawable/YOURCUSTOMBACKGROUND</item>
        <item name="Android:layout_marginLeft">5dp</item>
        <item name="Android:layout_marginRight">5dp</item>
        <item name="Android:layout_marginBottom">5dp</item>
</style>

その後、このスタイルをspinnerに適用します

3
Mehta

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:width="60dp" Android:gravity="left" Android:start="20dp">
                    <bitmap  Android:src="@drawable/down_button_dummy_dummy" Android:gravity="left"/>
                </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>

クリックして結果のレイアウト画像を表示

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/custom_spinner_icon">
         </bitmap>
    </item>
</layer-list>

私がやったようにアイコンを非表示にすることで管理できます:

<FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">
    <Spinner Android:id="@+id/fragment_filter_sp_users"
             Android:layout_width="match_parent"
             Android:background="@color/colorTransparent"
             Android:layout_height="wrap_content"/>

    <ImageView
            Android:layout_gravity="end|bottom"
            Android:contentDescription="@null"
            Android:layout_marginBottom="@dimen/_5sdp"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:src="@drawable/ic_arrow_bottom"
    />
</FrameLayout>
1
Sunil

ドロップダウンアイコンを使用せずにドロップダウンを使用する

<?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="#ffffff" Android:startColor="#ffffff" Android:type="linear" /><!--For gradient background-->

                <stroke Android:width="1dp" Android:color="#FFF" /><!--For Border background-->

                <corners Android:radius="0dp" /><!--For background corner-->

                <padding Android:bottom="3dp" Android:left="3dp" Android:right="6dp" Android:top="3dp" /><!--For padding for all sides-->
            </shape>
        </item>
        <item>
            <bitmap Android:gravity="center|right" Android:src="@drawable/ic_down_arrow" /> // Replace with your Icon

        </item>
    </layer-list>
</item>
1
siddharth patel

カスタムスピナーを使用しているため、BackBackgroundを設定するとDrawableが伸縮するため、これには多くの困難がありました。これに対する私の解決策は、Spinner TextViewの右側にドロウアブルを追加することでした。カスタムスピナーのコードスニペットを示します。トリックは、getViewをオーバーライドし、必要に応じてTextviewをカスタマイズすることです。

public class NoTextSpinnerArrayAdapter extends ArrayAdapter<String> {

    private String text = "0";

    public NoTextSpinnerArrayAdapter(Context context, int textViewResourceId, List<String> objects) {
        super(context, textViewResourceId, objects);
    }

    public void updateText(String text){
        this.text = text;
        notifyDataSetChanged();
    }

    public String getText(){
        return text;
    }

    @NonNull
    public View getView(int position, View convertView, @NonNull ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        TextView textView = view.findViewById(Android.R.id.text1);
        textView.setCompoundDrawablePadding(16);
        textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_menu_white_24dp, 0);

        textView.setGravity(Gravity.END);
        textView.setText(text);
        return view;
    }
}

また、スピナーの背景を透明に設定する必要があります。

<lifeunlocked.valueinvestingcheatsheet.views.SelectAgainSpinner
            Android:id="@+id/saved_tickers_spinner"
            Android:background="@Android:color/transparent"
            Android:layout_width="60dp"
            Android:layout_height="match_parent"
            tools:layout_editor_absoluteX="248dp"
            tools:layout_editor_absoluteY="16dp" />

そして、あなたがそれを望むなら、私のカスタムスピナー....

public class SelectAgainSpinner extends Android.support.v7.widget.AppCompatSpinner {
    public SelectAgainSpinner(Context context) {
        super(context);
    }

    public SelectAgainSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SelectAgainSpinner(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setPopupBackgroundDrawable(Drawable background) {
        super.setPopupBackgroundDrawable(background);
    }

    @Override
    public void setSelection(int position, boolean animate) {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position, animate);
        if (sameSelected) {
            // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
            if (getOnItemSelectedListener() != null) {
                getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
        }
    }

    @Override
    public void setSelection(int position) {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position);
        if (sameSelected) {
            // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
            if (getOnItemSelectedListener() != null) {
                getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
        }
    }
}
0