旋转器上的文字与白色背景相同。

40

我的旋转器上的文字是白色的,我不知道为什么。

在此输入图片描述

这是我的XML,没有什么特别的。

 <Spinner
     android:id="@+id/spinner_date"
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:layout_weight="1" />

我的代码

dateSpinner = (Spinner) findViewById(R.id.spinner_date);
selectedDate = calendar.getTime();
List<String> list = new ArrayList<String>();
list.add(formatter.format(selectedDate));
dateAdapter = new ArrayAdapter<String>(mContext,
            android.R.layout.simple_spinner_item, list);
dateSpinner.setAdapter(dateAdapter);

我的文本显示成白色可能是什么原因?

编辑: 我找到了原因,是我替换了在 onCreate 中设置的 mContext 参数。

mContext = getApplicationContext();

现在我使用d

ateAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, list);

它能够工作。


4
我也遇到过同样的问题,原因是有人在代码里使用了 ArrayAdapter.createFromResource( this.getActivity().getApplicationContext(), R.array.security_questions, android.R.layout.simple_spinner_item) 而不是 ArrayAdapter.createFromResource( this.getActivity(), R.array.security_questions, android.R.layout.simple_spinner_item)。使用 getApplicationContext() 函数确实会导致问题,可能是应用程序和活动之间的主题不同所致。 - Jeff
非常感谢!经过长时间的搜索,我找到了您的帖子并解决了我的问题。 - Antiohia
@Jeff 非常感谢您提供的解决方案,它节省了我很多时间! - hetsgandhi
8个回答

107

我有相同的问题并找到了答案。您不使用应用程序上下文,而是直接使用 getActivity()(如果您在片段中)或 this(如果您在活动中),它将起作用。

 dateAdapter = new ArrayAdapter<String>(**this**,
        android.R.layout.simple_spinner_item, list);

我正在使用SimpleCursorAdapter,但这并没有解决我的问题。有什么想法吗? - AdamMc331
@Le Hung,你说得对,当我们使用this而不是getApplicationContext时,看起来确实很好。但是当我们使用getApplicationContext时,事情看起来有些奇怪。谢谢啊。 - Ahesanali Suthar

16

我使用以下方法解决了这个问题

getBaseContext()

取代

getApplicationContext()

是的,我在扩展AsyncTask类中使用了ArrayAdapter,并且遇到了同样的问题... getBaseContext()对我有用.. - RAVI VAGHELA

3

i change it from

new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, some_list);

要创建一个新的ArrayAdapter<String>,需要传入三个参数:thisandroid.R.layout.simple_spinner_itemlist

虽然已经解决了问题,但是我不想使用"this"关键字。


3

我已经修改了那个旋转器文本视图的文本颜色,而不需要创建新的布局。虽然这是很久以前的事情了,但这是对我有效的方法,所以想分享出来。最好的部分是你可以在任何默认适配器上使用它。

以下是代码:(Activity使用this,Fragments使用requireActivity)

1)Java

arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,groups){
        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            TextView listItem = view.findViewById(android.R.id.text1);
            listItem.setTextColor(Color.WHITE);
            listItem.setTextSize(20);
            listItem.setElevation(18);
            return view;
        }
    };

2) Kotlin

arrayAdapter = object : ArrayAdapter<String>(requireActivity(), android.R.layout.simple_spinner_item, spinnerCategoriesList) {
        override fun getView(position: Int, @Nullable convertView: View?, parent: ViewGroup): View {
            val view = super.getView(position, convertView, parent)
            val listItem = view.findViewById<TextView>(android.R.id.text1)
            listItem.setTextColor(Color.BLACK)
            listItem.textSize = 16f
            return view
        }
    }

2
我也曾遇到同样的问题,那是因为我的应用程序主题。我通过替换

解决了这个问题。
android.R.layout.simple_spinner_item

使用

android.R.layout.simple_list_item_1

在我的ArrayAdapter中。我希望这可以解决你的问题。


1
也许您在项目的layout文件夹中的simple_spinner_item.xml中有一个白色的android:textColor="@android:color/white"属性。更好的方法是使用自定义的spinner item layout,并设置一个好的android:textColor="@android:color/COLOR_YOU_WANT_TO_USE"属性。

1
simple_spinner_item来自于Android,而不是项目本身...我不确定它是否可编辑? - Jeff

0

我假设您已经为您的Spinner创建了自己的TextView,例如:

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="14sp"
    android:textColor="@color/white"
    android:padding="5dip"
    />

然后通过类似这样的调用将其粘贴到您的适配器中

String[] spinnerItems = getResources().getStringArray(R.array.my_array);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.spinner_text, spinnerItems);

这应该会导致您的下拉列表视图中包含其项目的选择文本以白色绘制。现在,您的下拉列表视图的背景将受到您的应用程序主题的影响,在大多数情况下,将导致您的白色文本呈现在白色背景上。为了避免这种情况,Android 允许您为您的 Spinner 下拉列表视图设置资源。您可以设置自己的视图或者只是使用默认的下拉列表视图,这将通过调用覆盖您的自定义 TextView 在下拉菜单中。
 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

完整的代码可能看起来像这样

this.spinner = findViewById(R.id.spinnerView);
String[] spinnerItems = getResources().getStringArray(R.array.my_array);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.spinner_text, spinnerItems);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
this.spinner.setAdapter(adapter);

-1

您可以轻松地为Spinner添加样式。在style.xml中使用以下代码:

 <style name="SpinnerThemeLight" >
    <item name="android:colorBackground">@color/black</item>
    <item name="android:textColorPrimary">@color/black</item>
    <item name="android:textColorSecondary">@color/black</item>
    <item name="android:textColorTertiary">@color/black</item>
    <item name="android:textColorPrimaryDisableOnly">@color/black</item>
</style>

在上述的xml文件中,我仅为了节省时间而简单地指定了黑色。请随意尝试并确定您喜欢的颜色。
activity.xml中定义Spinner如下:
 <android.support.v7.widget.AppCompatSpinner
   android:id="@+id/spinner"
   android:layout_width="wrap_content"
   android:layout_height="match_parent"
   android:entries="@array/countrys"
   android:spinnerMode="dropdown"
   android:theme="@style/SpinnerThemeLight"/>

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