【问题标题】:Remove Spacing or Padding in android Spinner删除 android Spinner 中的间距或填充
【发布时间】:2015-05-23 18:02:03
【问题描述】:

我正在使用支持 lib v21 中的 android spinner 和 edittext。我想将文本对齐到与edittext相同的位置,如图所示。但是,默认微调器包括间距或填充。所以,我想删除它以将文本左对齐。请帮助如何删除它。

【问题讨论】:

  • 您可以通过九个补丁自定义您自己的 Spinner 并指定填充

标签: android spinner


【解决方案1】:

在您的 SpinnerAdapter 中:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        view.setPadding(0, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
        return view;
}

【讨论】:

  • 在我的情况下工作..但也许超级视图是不必要的。只需设置“convertView.setPadding()”即可。
  • @Chan 您在这里使用哪个适配器?
  • @VolodymyrKhodonovych SpinnerAdapter
【解决方案2】:

此数组适配器会移除 Android Spinner 中的左侧填充。

Kotlin 版本:

open class NoPaddingArrayAdapter<T>(context: Context, layoutId: Int, items: List<T>?) : ArrayAdapter<T>(context, layoutId, items) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
        val view = super.getView(position, convertView, parent)
        view.setPadding(0,view.paddingTop,view.paddingRight,view.paddingBottom)
        return view
    }
}

【讨论】:

  • 这是最简单的答案
  • 完美解决方案!
【解决方案3】:

您的Spinner 中显示的TextView 的布局来自您的SpinnerAdapter,它提供了2 种方法:

  • getView(position, convertView, parent):返回折叠状态的视图,你可以覆盖它来为不同的选定项返回不同的布局
  • getDropdownView(position, convertView, parent):为展开状态的每个下拉项返回视图(单击 Spinner 打开弹出/对话框进行选择后)

在您的情况下,您应该覆盖您的 SpinnerAdapter.getView(position, convertView, parent) 并使用您选择的填充/间距来扩大布局。

例如:

spinner.setAdapter(new MyAdapter());

MyAdapter.java

class MyAdapter implements SpinnerAdapter {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.spinner_item, parent, false);
        }
        // bind your data here
        return convertView;
    }
    // other implementation
}

res/layout/spinner_item.xml

<!-- set padding margin whatever here -->
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

您还可以方便地使用SpinnerAdapter indirect subclasses (ArrayAdapter&lt;T&gt;, BaseAdapter, CursorAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, ThemedSpinnerAdapter) 提供的框架之一,只需确保提供getView() 方法将使用的正确布局。

【讨论】:

    【解决方案4】:

    你也可以去掉xml中spinner的padding

    只需将 padding 设置为 0dp。

        <Spinner
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:padding="0dp"     
            android:id="@+id/my_spinner">
    

    【讨论】:

    • 不起作用。 OP 询问的是微调器内部文本的填充,而不是微调器本身。
    【解决方案5】:

    试试下面的代码。将微调器列表项布局中的样式属性更改为 textViewStyle,如下所示

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        style="?android:attr/textViewStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="false"
        android:textAlignment="inherit"
        android:textAppearance="?android:attr/textAppearanceMedium" />
    

    【讨论】:

      【解决方案6】:

      试试这个,

      1. 为微调行创建自定义布局(根据需要)。

      2. 在将数据适配器设置为微调器时扩展布局。

      【讨论】:

        【解决方案7】:

        如果你不想在 Java 代码中乱七八糟并拥有它的样式

        搜索此文件 (Cmd+Shift+O) abc_spinner_textfield_background_material.xml

        并复制到您的项目中。从根元素中删除所有 inset 值,并将文件作为微调器的背景。

        就我而言,它看起来像这样 (drawable/spinner_background.xml)

        <inset xmlns:android="http://schemas.android.com/apk/res/android">
            <selector>
                <item
                    android:state_checked="false"
                    android:state_pressed="false">
                    <layer-list>
                        <item android:drawable="@drawable/abc_textfield_default_mtrl_alpha" />
                        <item android:drawable="@drawable/abc_spinner_mtrl_am_alpha" />
                    </layer-list>
                </item>
                <item>
                    <layer-list>
                        <item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha" />
                        <item android:drawable="@drawable/abc_spinner_mtrl_am_alpha" />
                    </layer-list>
                </item>
            </selector>
        </inset>
        

        在我的styles.xml中我是这样使用的

        <style name="DxSpinner" parent="@style/Widget.AppCompat.Spinner.Underlined">
            <item name="android:background">@drawable/spinner_background</item>
        </style>
        

        【讨论】:

          【解决方案8】:

          也许这是最简单的方法,也可以正常工作。要减少 Spinner 的左填充,您可以使用 set padding left 为减号,这样它就会向左移动。例如android:layout_marginLeft="-8dp" 这不是最佳实践,只是一个简单的 hack。这是一个代码示例:

          <Spinner
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_gravity="left"
          android:layout_marginLeft="-8dp"
          android:entries="@array/arr_tipe_kendaraan"
          android:gravity="left"
          android:paddingTop="14dp"
          android:paddingBottom="8dp"
          android:prompt="@string/action_sign_in"
          android:spinnerMode="dialog" />
          

          希望这会有所帮助。

          【讨论】:

            【解决方案9】:

            这个 Kotlin 代码比另一个答案中的 getView 覆盖更简洁一些。 它在更少的行中更清楚地表明它主要只是在做 super 所做的事情,除了它还覆盖了 setPadding 的左侧值。

            override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
                return super.getView(position, convertView, parent).apply {
                    setPadding(0, paddingTop, paddingRight, paddingBottom)
                }
            }
            

            这是我的完整片段代码,它使用数据绑定对象进行完整的微调器数组适配器覆盖,它还在getDropDownView 中执行选定项目和交替背景颜色:

            binding.editSpinner.apply {
                this.context ?: return@apply
                this.adapter = object : ArrayAdapter<Any>(
                    requireContext(),
                    android.R.layout.simple_spinner_dropdown_item,
                    SpinnerTypeValues.values().map { it.text }
                ) {
                    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
                        return super.getDropDownView(position, convertView, parent).also {
                            when {
                                position == this@apply.selectedItemPosition -> it.setBackgroundColor( Color.rgb(245, 212, 119) )
                                position % 2 == 0 -> it.setBackgroundColor(Color.rgb(240, 240, 240))
                                else -> it.setBackgroundColor(Color.rgb(214, 235, 189))
                            }
                        }
                    }
                    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
                        return super.getView(position, convertView, parent).apply {
                            setPadding(0, paddingTop, paddingRight, paddingBottom)
                        }
                    }
                }
                this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                    override fun onNothingSelected(parent: AdapterView<*>?) {}
                    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                        viewModel.saveSpinnerSelection(position)
                    }
                }
            }
            

            【讨论】:

              【解决方案10】:

              我也遇到了这个问题。我能够通过调整边距而不是填充来解决它,因此将 android:marginStart="0dp" 设置为微调器项。

              【讨论】:

                【解决方案11】:

                在你的 onViewCreated() 中

                spinner.post { spinner.setPadding(0,0,0,0) } 
                

                【讨论】:

                  【解决方案12】:
                  1. 创建一个文本视图布局 view_spinner_text_view.xml:

                    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
                              android:layout_width="wrap_content"
                              android:layout_height="wrap_content" />
                    
                  2. 通过提供上述布局创建适配器:

                        ArrayAdapter.createFromResource(
                            context,
                            R.array.my_values,
                            R.layout.view_spinner_text_view // <-- this is for the spinner itself
                        ).also { adapter ->
                            adapter.setDropDownViewResource(
                                android.R.layout.simple_spinner_dropdown_item // <-- this is for the dropped-down items (you can customize this one as well)
                            )
                            spinner.adapter = adapter
                        }
                    

                  【讨论】:

                    【解决方案13】:

                    用新的 spinner_item 布局替换代码中的 android.R.layout.simple_spinner_item 布局

                    spinner_item 的代码:

                    <?xml version="1.0" encoding="utf-8"?>
                    <TextView
                        xmlns:android="http://schemas.android.com/apk/res/android"
                        android:id="@+id/text1"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:textSize="@dimen/primaryText"
                        android:textColor="@color/black"
                        android:textStyle="bold"/>
                    

                    这将删除额外的边距,您可以根据自己的要求对其进行样式设置。谢谢。

                    【讨论】:

                      【解决方案14】:

                      这项工作适合我

                      Spinner spn = (Spinner) findViewById(R.id.spn);
                      
                      spn.setPadding(0, spn.getPaddingTop(), spn.getPaddingRight(), spn.getPaddingBottom());
                      

                      【讨论】: