【问题标题】:Android Spinner Item Layout for Default Entries in XMLXML 中默认条目的 Android Spinner 项目布局
【发布时间】:2017-01-15 20:36:54
【问题描述】:

我有两个 Spinner。其中之一是在运行时填充的。

groupSpinner.setAdapter(new ArrayAdapter<>(this,
                 android.R.layout.simple_spinner_item, groupNames));

另一个是使用字符串数组在 XML 布局中预填充的。

<Spinner ...
    android:entries="@array/my_items_here" />

两个 Spinner 看起来都很好。但是,当它们的项目显示时,子布局不匹配,在dropdowndialog 模式下。 我一定遗漏了一些非常简单的东西,但是 我怎样才能将它们设置为使用相同的布局(希望 android.R.layout.simple_spinner_item),而不创建我自己的自定义布局,或者在运行时加载 XML 字符串数组?

这似乎是一件基本的事情,但我找不到答案,我已经搜索了很多。

请看下面的截图:

*请原谅在第二张图片中使用了希腊字符。我已经检查并确认问题与使用希腊字符无关。

【问题讨论】:

  • 两个微调器布局看起来都一样,除了宽度。
  • 对话框中的项目看起来不一样。我从来没有在任何地方将第二个设置为粗体。这只是显示它们的默认方式。但是,如您所见,第一个对话框也使用默认方式,效果要好得多,而且不那么粗糙。所以,我正在寻找一种方法来设置第二个对话框的项目布局,而不是在运行时加载它们。
  • 你能发布两个微调器的代码吗?
  • 您是否尝试过使用adapter.setDropDownViewResource()?另外,两者的主题/风格相同吗?
  • 试试这个((ArrayAdapter)preFilledSpinner.getAdapter()).setDropDownViewResource(android.R.layout.simple_spinner_item);

标签: java android android-layout android-spinner android-xml


【解决方案1】:

试试这个((ArrayAdapter)preFilledSpinner.getAdapter()).setDropDownVie‌wResource(android.R.‌​layout.simple_spinne‌​r_item);

要知道它是如何工作的,只需检查AppCompatSpinner 的代码,下面是AppCompatSpinner 的默认代码,以便在您通过条目时弄清楚它是如何工作的。

final CharSequence[] entries = a.getTextArray(R.styleable.Spinner_android_entries);
if (entries != null) {
    final ArrayAdapter<CharSequence> adapter = new ArrayAdapter<>(context,android.R.layout.simple_spinner_item, entries);
        adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        setAdapter(adapter);
}

当我们通过 XML 传递条目时,他们将创建一个 ArrayAdapter 并应用代码 adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);,您可以在其中看到,R.layout.support_simple_spinner_dropdown_item 是默认设置的,这应该适用于参数,但不幸的是他们已将其修复

【讨论】:

  • 谢谢@Moinkhan。你应该得到你的时间的赏金。请稍微修改一下这个问题,让它包含一些关于它为什么正确的信息,这样会更漂亮。
  • 您创建条目的代码与问题无关且不正确,因为您直接在new ArrayAdapter&lt;&gt;()构造函数中设置了DropDown View Resource,无需再次设置。避免在您的答案中重新创建问题,因为这可能会产生误导。
  • @mavrosxristoforos 这是AppCompatSpinner的默认代码我已经编辑了答案。
【解决方案2】:

这就是我在最近的项目中的做法。 Java 代码:

public void spinner_settings() {

    Spinner spinner = (Spinner) findViewById(R.id.spinner);

    adapter =
            ArrayAdapter.createFromResource(this, R.array.activity_list, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            switch(position){
                case 0:
                    // TO-DO something when item selected
                    break;
                case 1:
                    // TO-DO something when item selected
                    break;
                case 2:
                    // TO-DO something when item selected
                    break;
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // your code here
        }

    });
}

res-> 值 -> strings.xml

<resources>
    <string-array name="activity_list">
        <item>MainFrame</item>
        <item>Settings</item>
        <item>Translation Rules</item>
    </string-array>
</resources>

res-> 值 -> styles.xml

<resources>
 <!-- For the resting Spinner style -->
        <item name="android:spinnerItemStyle">
            @style/spinnerItemStyle
        </item>

        <!-- For each individual Spinner list item once clicked on -->
        <item name="android:spinnerDropDownItemStyle">
            @style/spinnerDropDownItemStyle
        </item>

    </style>

    <style name="spinnerItemStyle">
        <item name="android:textSize">23sp</item>
        <item name="android:textColor">#000000</item>
        <item name="android:background">#008080</item>
    </style>

    <style name="spinnerDropDownItemStyle">
        <item name="android:padding">5sp</item>
        <item name="android:textSize">25sp</item>
        <item name="android:textColor">#000000</item>
    </style>
    </resources>

希望对你有帮助!

【讨论】:

  • 感谢您的回答。问题不在于如何在运行时使用 XML 数组为 Spinner 充气。
猜你喜欢
  • 2010-11-13
  • 1970-01-01
  • 2013-06-28
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 2017-07-21
  • 2012-01-03
相关资源
最近更新 更多