安卓 Spinner 显示文本问题

3

您好,我遇到了一个关于文本大小不正确显示的问题,我的活动页面上下拉菜单是很大的(如下图),这正是我想要的,但是当下拉菜单没有打开时,它有很小的文本(上图)。以下是下拉菜单所引用的xml布局:

simple_spinner_dropdown_item.xml
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="50sp"
    android:gravity="left"
    android:textColor="#000000"
    android:padding="5dip"
    android:textStyle="bold"/>

以下是菜单中显示下拉框的 XML 代码:
main_menu.xml
<Spinner
    android:id="@+id/spinnerMainMenu"
    android:layout_width="784dp"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.072"
    tools:layout_editor_absoluteX="8dp" />

最后是它如何显示的代码。
MainMenu.java
final Spinner mainMenuDrpDwn = findViewById(R.id.spinnerMainMenu);
    String[] machines = new String[]{"215 DT", "420 DT", "215 CANNAGIN"};
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, machines);
    adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
    mainMenuDrpDwn.setAdapter(adapter);

enter image description here

enter image description here

3个回答

2

让我们稍微了解一下适配器的概念,适配器将Spinner的布局文件和数据绑定到Spinner上,需要两个布局文件。其中一个是在初始化ArrayAdapter时传递的布局资源,即:

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

这是当下拉菜单未展开即显示选项时,spinner的布局资源。另一个是dropdown resource,即spinner下拉菜单中每个选项的布局资源,用以下方式设置:

adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);

现在问题是你传递了自定义的下拉资源,使得下拉框看起来符合要求,但是你却传递了标准布局文件用于视图,即android.R.layout.simple_spinner_dropdown_item。因此,如果您希望解决这个问题,您可以为普通视图传递相同的下拉资源(如果您愿意的话),否则您可以创建另一个具有所需属性的布局,并像以下代码一样将其传递:custom_drop_down_spinner_item
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="false"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/actionBarSize"
    android:ellipsize="marquee"
    android:textSize="25sp"
    android:background="@android:color/white"
    android:textColor="@color/colorAccent"
    android:fontFamily="sans-serif-smallcaps"/>

自定义旋转器项

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text2"
    style="?android:attr/spinnerItemStyle"
    android:background="@android:color/holo_blue_light"
    android:singleLine="false"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:textAlignment="inherit"
    android:gravity="center"
    android:textSize="50sp"
    android:textColor="@color/colorPrimary"/>

将其设置为Spinner:

ArrayAdapter<CharSequence> arrayAdapter = ArrayAdapter.createFromResource(this,
                R.array.educational_qualification_orig_array, R.layout.custom_spinner_item);
        arrayAdapter.setDropDownViewResource(R.layout.custom_drop_down_spinner_item);
        spinner.setAdapter(arrayAdapter);

生成的未展开状态下的旋转器项将如下所示:

Custom spinner item


非常感谢,因为我使用字符串作为显示的文本,所以我不得不编辑您的适配器代码以适应。ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.simple_spinner_item, machines) - Orion447

1
在你的适配器中使用相同的布局文件。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.simple_spinner_dropdown_item, machines);

只有在你的 simple_spinner_dropdown_item.xmlTextView 的 id 是 text1 时,它才能正常工作。

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="50sp"
    android:gravity="left"
    android:textColor="#000000"
    android:padding="5dip"
    android:textStyle="bold"/>

0

dr3k 的回答基础上,我在源代码中找到了这个:

http://androidxref.com/7.1.1_r6/xref/frameworks/base/core/res/res/values/attrs.xml

4742    <declare-styleable name="Spinner">
...
4763        <!-- Reference to a layout to use for displaying a prompt in the dropdown for
4764             spinnerMode="dropdown". This layout must contain a TextView with the id
4765             {@code @android:id/text1} to be populated with the prompt text. -->
4766        <attr name="popupPromptView" format="reference" />
...
4772    </declare-styleable>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接