在android Spinner中删除Spacing或Padding

时间:2015-03-20 10:42:57

标签: android spinner

我正在使用支持lib v21的android spinner和edittext。我想将文本对齐,就像edittext一样,如图所示。但是,狡猾的旋转器包括间距或填充。所以,我想删除它以将文本对齐到左边。请帮助如何删除它。

enter image description here

13 个答案:

答案 0 :(得分:18)

在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;
}

答案 1 :(得分:3)

请尝试使用以下代码。将微调器列表项布局中的样式属性更改为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" />

答案 2 :(得分: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 :(得分:1)

试试这个,

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

  2. 将数据适配器设置为微调器时,
  3. 会使布局膨胀。

答案 4 :(得分:1)

TextView中显示的Spinner布局来自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 /布局/ 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 subclassesArrayAdapter<T>, BaseAdapter, CursorAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, ThemedSpinnerAdapter)提供的框架之一,只需确保提供getView()方法将使用的正确布局。

答案 5 :(得分:1)

如果您不想弄乱Java代码并将其置于样式

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

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

就我而言,它看起来像这样(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>

答案 6 :(得分:1)

您还可以在xml

中删除微调器的填充

只需要将填充设置为0dp。

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

答案 7 :(得分:0)

我也遇到了这个问题。我能够通过实际调整边距而不是填充来解决它,所以将android:marginStart =“0dp”设置为微调项目。

答案 8 :(得分:0)

也许这是最简单的方法,而且也可以正常工作。要减少Spinner的左填充,可以将set padding left设置为负,这样它将向左移动。例如,android:layout_marginLeft="-8dp"并不是最佳实践,只是一个简单的技巧。这是一个代码示例:

<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 :(得分:0)

此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 :(得分:0)

  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
        }
    

答案 11 :(得分:0)

用新的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"/>

这将删除多余的边距,您可以根据需要对其进行样式设置。谢谢。

答案 12 :(得分:-1)

这项工作对我来说

Spinner spn = (Spinner) findViewById(R.id.spn);

spn.setPadding(0, spn.getPaddingTop(), spn.getPaddingRight(), spn.getPaddingBottom());