删除android微调器中的间距或填充
我使用的是来自support lib v21的android spinner和edittext。我想将文本向左对齐,就像图中所示的edittext一样。但是,Deafolt微调器包括间距或填充。所以,我想删除它以使文本向左对齐。请帮助如何删除它 试试这个删除android微调器中的间距或填充,android,spinner,Android,Spinner,我使用的是来自support lib v21的android spinner和edittext。我想将文本向左对齐,就像图中所示的edittext一样。但是,Deafolt微调器包括间距或填充。所以,我想删除它以使文本向左对齐。请帮助如何删除它 试试这个 为微调器行创建自定义布局(根据需要) 将数据适配器设置为微调器时,对布局进行充气 在您的SpinnerAdapter中: @Override public View getView(int position, View convertView,
在您的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;
}
请尝试下面的代码来执行此操作。将微调器列表项布局中的样式属性更改为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" />
在微调器中显示的文本视图的布局来自微调器,它提供了两种方法:
getView(position,convertView,parent)
:返回折叠状态的视图,您可以覆盖它以返回不同选定项的不同布局
getDropdownView(位置、转换视图、父项)
:返回处于展开状态的每个下拉项的视图(单击微调器打开弹出/对话框进行选择后)
在您的情况下,您应该覆盖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\u 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" />
您还可以方便地使用所提供的框架之一(ArrayAdapter、BaseAdapter、CursorAdapter、ResourceCursorAdapter、SimpleAdapter、SimpleCursorAdapter、ThemedSpinGeneraAdapter
),只需确保提供将由getView()使用的正确布局即可
method.如果你不想把Java代码搞得一团糟,让它变成样式的话
搜索此文件(Cmd+Shift+O)
abc\u微调器\u文本字段\u背景\u material.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>
并复制到您的项目中。从根元素中删除所有插入值,并将该文件引用为微调器的背景
在我的例子中,它看起来是这样的(drawable/spinner\u background.xml
)
在我的styles.xml中,我是这样使用它的
<style name="DxSpinner" parent="@style/Widget.AppCompat.Spinner.Underlined">
<item name="android:background">@drawable/spinner_background</item>
</style>
@可绘制/微调器\u背景
您还可以删除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">
这是我的工作
Spinner spn = (Spinner) findViewById(R.id.spn);
spn.setPadding(0, spn.getPaddingTop(), spn.getPaddingRight(), spn.getPaddingBottom());
我刚才也谈到了这个问题。我可以通过调整边距而不是填充来解决这个问题,因此将android:margintart=“0dp”设置为微调器项。这个数组适配器删除了android微调器中的左填充
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
}
}
打开类NoPaddingArrayAdapter(上下文:context,layoutId:Int,items:List?):ArrayAdapter(上下文,layoutId,items){
覆盖视图(位置:Int,convertView:View?,父视图:ViewGroup?):视图{
val view=super.getView(位置、转换视图、父级)
view.setPadding(0,view.paddingTop,view.paddingRight,view.paddingBottom)
返回视图
}
}
在onViewCreated()中
也许这是最简单的方法,而且也很有效。要减少微调器的左填充,可以使用将左填充设置为负,使其向左移动。例如,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" />
希望这有帮助。此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)
}
}
}
binding.editSpinner.apply{
这是上下文吗return@apply
this.adapter=对象:ArrayAdapter(
requireContext(),
android.R.layout.simple\u微调器\u下拉菜单\u项,
SpinnerTypeValues.values().map{it.text}
) {
覆盖getDropDownView(位置:Int,convertView:View?,父级:ViewGroup):视图{
返回super.getDropDownView(position,convertView,parent){
什么时候{
位置==this@apply.selectedItemPosition->it.setBackgroundColor(Color.rgb(245212 119))
位置%2==0->it.setBackgroundColor(Color.rgb(240240240))
else->it.setBackgroundColor(Color.rgb(214235189))
}
}
}
覆盖视图(位置:Int,convertView:View?,父级:ViewGroup):视图{
返回super.getView(position,convertView,parent).apply{
设置填充(0,填充顶部,填充右侧,填充底部)
}
}
}
this.onItemSelectedListener=对象:AdapterView.onItemSelectedListener{
覆盖未选择的乐趣(父项:AdapterView?{}
覆盖已选择(父项:AdapterView?,视图:view?,位置:Int,id:Long){
viewModel.saveSpinnerSelection(位置)
}
}
}
创建文本视图布局视图\u微调器\u text\u 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
}
ArrayAdapter.createFromResource(
上下文
R.array.my_值,
R.layout.view\u微调器\u文本\u视图//
adapter.setDropDownViewResource(
android.R.layout.simple\u微调器\u下拉菜单\u item//将代码中的android.R.layout.simple\u微调器\u item布局替换为新的微调器\u 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"/>
这将是rem
<?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"/>