【问题标题】:How to style android spinner boxes?如何设计 android 微调框?
【发布时间】:2020-11-16 18:01:31
【问题描述】:

抱歉,如果这个问题已经得到解答,但我一直在寻找答案/尝试了几个小时,但我找不到任何东西。

我发现 android 微调框太大了:

按照我的口味,上面的“80”和“90”周围有太多的灰色空间。我想让它们不那么高和不那么宽。

但是,我不只是想设置像素高度/宽度,因为无法保证它们在所有设备上看起来都正确。

它们现在设置为 wrap_content。有没有办法让它包裹内容,但更紧密?那里似乎有相当多的填充物......

非常感谢!

编辑: 我已经取得了一些进展,我已经弄清楚如何将样式附加到视图,所以现在我正在尝试:

 <Spinner
    style="@style/spinner_style"
    etc

<style name="spinner_style">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:paddingLeft">0dp</item>
    <item name="android:paddingRight">0dp</item>
    <item name="android:paddingTop">0dp</item>
    <item name="android:paddingBottom">0dp</item>
    <item name="android:layout_marginLeft">0dp</item>
    <item name="android:layout_marginRight">0dp</item>
    <item name="android:layout_marginTop">0dp</item>
    <item name="android:layout_marginBottom">0dp</item>
</style>

但是,这似乎几乎没有任何效果:

之前。我怎样才能让框真正靠近文本?

编辑: 多一点进步。这个图片好像是整个灰色框加上下拉:

android:background="@android:drawable/btn_dropdown"

如果我能找到一些方法来缩小它?同样,我面临的挑战是我希望它正确地换行文本,这样我就可以确保它在所有设备上都能很好地显示。

编辑: 我想我将为微调器使用我自己的布局,但以一种可靠地包装文本的方式 - 可能使用线性布局并在其上设置背景颜色。当我有完整的代码时,我会发回。

【问题讨论】:

    标签: android spinner android-spinner


    【解决方案1】:

    由于您没有分享您的微调器,我将建议一些可能对您有所帮助的选项:

    如果您使用android.R.layout.simple_spinner_dropdown_item 作为您的微调器项目布局(当它关闭时)

    ArrayAdapter<Integer> adapter = new ArrayAdapter<>(this, 
                                       android.R.layout.simple_spinner_dropdown_item, myList);
    

    然后改成android.R.layout.simple_spinner_item,后面的padding比第一个少。

    如果这仍然会添加一些填充,您可以将 android:theme="@android:style/Theme.Holo.Light.NoActionBar" 属性添加到您的微调器 xml,尽管这会更改微调器箭头

    另一种选择是创建自定义微调器项目,类似地在创建适配器时将系统布局替换为您的项目。

    这是项目布局(只是一个带有 TextView 和 wrap_content 宽度/高度的新布局)

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    
    </TextView>
    

    【讨论】:

    • 谢谢。所有其他引用都建议添加自定义处理程序和自定义布局,而我们所需要的只是针对窄微调器的布局!
    【解决方案2】:

    好的,这就是我所得到的,它给了我这样的效果:

    与我得到的默认 Spinner 相比:

    我更喜欢我的版本,但当然这些都是主观的。

    我所做的是在适配器中设置自己的布局和文本视图(似乎您可以同时设置两者),以便我的适配器设置代码如下所示:

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            R.layout.my_spinner_layout, R.id.dropdowntext, list);
    adapter.setDropDownViewResource(R.layout.my_spinner_dropdown_layout);
    spinner.setAdapter(adapter);
    

    我还必须为下拉列表创建我自己的自定义布局 - 上面的 R.layout.my_spinner_dropdown_layout - 因为微调器在绘制下拉列表时会重用用于未打开框的 textview,因此相同的 textview 需要在两者中都可用布局。

    我创建了两个名为 my_spinner_layout.xmlmy_spinner_dropdown_layout.xml 的新 xml 布局文件

    它们分别是这样的:

    <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/linearLayoutDisplayName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:background="#DDDDDD"
            android:gravity="center"
            android:orientation="horizontal">
    
            <TextView xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/dropdowntext"
                style="@style/spinner_style"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:singleLine="true" />
    
            <ImageView
                android:id="@+id/dropdownicon"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_alignParentTop="true"
                android:contentDescription="TODO"
                android:src="@drawable/dropdown" />
    
        </LinearLayout>
    

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/dropdowntext"
        style="@style/spinner_style"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true" />
    

    基本上,我已经替换了默认值 TextView 和一个巨大的灰色背景图像,包​​括一个下拉箭头,水平线性布局包含一个 TextView 和一个下拉图像,具有灰色背景。

    现在灰色很好地包裹了内容(我添加了 5dp 的填充)。

    希望这对某人有所帮助,或者如果它有问题,也许有人会纠正我。

    【讨论】:

      【解决方案3】:

      我真的很努力为您找到解决问题的最佳解决方案,但似乎没有办法这样做。唯一的方法是创建一个自定义微调器,如https://stackoverflow.com/a/37859442/11896005

      中所述

      另外,对不起,如果我只是想帮助你,很烦人!

      【讨论】:

      • 一切都很有趣,但不是我问的。如何减少框中文本周围的填充?谢谢。
      • @Bruce 哦,抱歉没有很好地阅读问题。给我一秒钟,我会编辑我的答案
      • 您似乎只是从与我的问题模糊相关的答案中复制和粘贴。这对我或你没有帮助。请停下来。
      • @Bruce Aight 给我一点时间重新检查你的问题,我会以我自己的风格重新发布我的答案!
      • @Bruce 另外我只是想帮忙,如果我造成任何麻烦,请见谅
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      相关资源
      最近更新 更多