删除android微调器中的间距或填充

删除android微调器中的间距或填充,android,spinner,Android,Spinner,我使用的是来自support lib v21的android spinner和edittext。我想将文本向左对齐,就像图中所示的edittext一样。但是,Deafolt微调器包括间距或填充。所以,我想删除它以使文本向左对齐。请帮助如何删除它 试试这个 为微调器行创建自定义布局(根据需要) 将数据适配器设置为微调器时,对布局进行充气 在您的SpinnerAdapter中: @Override public View getView(int position, View convertView,

我使用的是来自support lib v21的android spinner和edittext。我想将文本向左对齐,就像图中所示的edittext一样。但是,Deafolt微调器包括间距或填充。所以,我想删除它以使文本向左对齐。请帮助如何删除它

试试这个

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

  • 将数据适配器设置为微调器时,对布局进行充气


  • 在您的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"/>