私が見つけた解決策は、スピナーのドロップダウンアイコンを変更することです:
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" />
結果は次のとおりです。
ご覧のとおり、アイコンは右揃えにする必要があり、伸びないようにする必要があるため、これは許容できる解決策ではありません。
アイコンを伸縮させずに正しく整列させるにはどうすればよいですか?
編集
まだ有効な解決策がないため、質問を指定する必要があります。これは、標準テーマを使用した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" />
そして、私が望むすべて(実際にはそれほど多くはないと思います)は矢印を変更しています。私は右下隅にある矢印を表示したくない、私はこの矢印を右の垂直中央に表示したい:
そして、私が今まで試したすべてのソリューション:
単に働いていませんでした。彼らはアイコンを伸ばしていたか、一番下の行が欠落していたか、何か他のものが完全に間違っていました。別の矢印が欲しいだけです。
次のスタイルをスピナーに適用してみてください
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>
スピナーにテーマを追加
<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>
次のようなカスタム背景を作成する必要があります。
<?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に適用します
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>
ドロップダウンアイコンを使用せずにドロップダウンを使用する
<?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>
カスタムスピナーを使用しているため、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());
}
}
}
}