【发布时间】:2015-05-23 18:02:03
【问题描述】:
我正在使用支持 lib v21 中的 android spinner 和 edittext。我想将文本对齐到与edittext相同的位置,如图所示。但是,默认微调器包括间距或填充。所以,我想删除它以将文本左对齐。请帮助如何删除它。
【问题讨论】:
-
您可以通过九个补丁自定义您自己的 Spinner 并指定填充
我正在使用支持 lib v21 中的 android spinner 和 edittext。我想将文本对齐到与edittext相同的位置,如图所示。但是,默认微调器包括间距或填充。所以,我想删除它以将文本左对齐。请帮助如何删除它。
【问题讨论】:
在您的 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;
}
【讨论】:
此数组适配器会移除 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
}
}
【讨论】:
您的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<T>, BaseAdapter, CursorAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, ThemedSpinnerAdapter) 提供的框架之一,只需确保提供getView() 方法将使用的正确布局。
【讨论】:
你也可以去掉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">
【讨论】:
试试下面的代码。将微调器列表项布局中的样式属性更改为 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" />
【讨论】:
试试这个,
为微调行创建自定义布局(根据需要)。
在将数据适配器设置为微调器时扩展布局。
【讨论】:
如果你不想在 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>
【讨论】:
也许这是最简单的方法,也可以正常工作。要减少 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" />
希望这会有所帮助。
【讨论】:
这个 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)
}
}
}
【讨论】:
我也遇到了这个问题。我能够通过调整边距而不是填充来解决它,因此将 android:marginStart="0dp" 设置为微调器项。
【讨论】:
在你的 onViewCreated() 中
spinner.post { spinner.setPadding(0,0,0,0) }
【讨论】:
创建一个文本视图布局 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" />
通过提供上述布局创建适配器:
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
}
【讨论】:
用新的 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"/>
这将删除额外的边距,您可以根据自己的要求对其进行样式设置。谢谢。
【讨论】:
这项工作适合我
Spinner spn = (Spinner) findViewById(R.id.spn);
spn.setPadding(0, spn.getPaddingTop(), spn.getPaddingRight(), spn.getPaddingBottom());
【讨论】: