【问题标题】:Android Spinner Display Text IssueAndroid Spinner 显示文本问题
【发布时间】:2018-07-07 10:47:35
【问题描述】:

您好,我的活动中的文本大小无法正确显示,下拉菜单本身很大(下图),这就是我想要的,但是当下拉菜单未打开时,它有小文本(上图)。这是微调器从中提取的 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);

【问题讨论】:

    标签: java android android-spinner


    【解决方案1】:

    为此让我们稍微了解一下适配器的概念,将微调器的布局文件和数据绑定到微调器的适配器需要两个布局文件。一种是您在ArrayAdapter 初始化期间传入的布局资源,即

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

    这是微调器处于未展开状态时的布局资源,即显示微调器项目。另一个是下拉资源,它是微调器的下拉项的布局,即微调器中的每个项在展开时的外观,设置如下:

    adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
    

    现在的问题是你传入了一个自定义的dropdown resource,所以你让下拉菜单看起来像你想要的那样,但是你传入了视图的标准布局文件,即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"/>
    

    custom_spinner_item

    <?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"/>
    

    将其设置为微调器:

    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);
    

    未展开状态下生成的微调器项看起来像

    【讨论】:

    • 非常感谢,因为我使用 sting 作为显示的文本,所以我必须编辑您的适配器代码以适应。 ArrayAdapter 适配器 = new ArrayAdapter(this, R.layout.simple_spinner_item, machines)
    【解决方案2】:

    在适配器中使用相同的布局文件。

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

    只有当你的TextView id 是text1 在你的simple_spinner_dropdown_item.xml 上时它才会起作用

    <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"/>
    

    【讨论】:

      【解决方案3】:

      扩展 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多