安卓ListView文字颜色

54
我试图将 ListView 的文本颜色设置为黑色,因为我正在使用白色背景。
这是我的 MailActivity。
public class MailActivity extends ListActivity {

    String[] listItems = { "Compose", "Inbox", "Drafts", "Sent" };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.mails);

        setListAdapter(new ArrayAdapter(this,
                android.R.layout.simple_list_item_1, listItems));

    }
}

以及我的XML文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:background="#FFFFFF">

    <ListView 
        android:id="@android:id/list" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

    <TextView 
        android:id="@android:id/empty" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="Empty set" 
        android:textColor="#000000" />

</LinearLayout>

我得到了白色的背景,但不确定在哪里将前景设置为黑色。我已经尝试在 xml 中设置,但似乎没有帮助。

8个回答

153

好的,以下是你需要明确的一些事情:

  1. 你在xml文件中设置的背景颜色是活动(activity)的背景颜色,而不是你正在定义的列表项(ListItems)的背景颜色。
  2. 每个列表项都有其自己的布局文件,如果你使用复杂的列表项布局,则应该传递或膨胀。

我将尝试用代码示例来解释:

****让我们从ListItems布局开始** :将其保存在Android项目的res/layout文件夹中,例如**list_black_text.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Definig a container for you List Item-->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:gravity="center_vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <!-- Defining where should text be placed. You set you text color here-->
    <TextView
        android:id="@+id/list_content"
        android:textColor="#000000"
        android:gravity="center"
        android:text="sample"
        android:layout_margin="4dip"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
    />
</LinearLayout>

简单的布局,具体来说就是一个 TextView。你必须为 TextView 分配一个 id 才能使用它。

现在谈论一下你的屏幕/活动/主要布局,如我所说,你正在使用 android:background 属性定义屏幕的背景。我看到你在那里定义了一个 TextView,我怀疑你试图在那里定义内容/列表项,这完全没有必要。

这是编辑后的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:background="#FFFFFF">

    <ListView 
        android:id="@android:id/list" android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
        <!-- REMOVED TEXT VIEW, AND KEEPING BACKGROUND WHITE -->
</LinearLayout>

最后也是最重要的,设置你的适配器。

setListAdapter(new ArrayAdapter<String>(
            this, R.layout.list_black_text, R.id.list_content, listItems));

注意我们传递给适配器的布局资源 R.layout.list_black_text,以及我们声明的 TextView ID R.id.list_content。我还将 ArrayAdapter 更改为 String 类型,因为它是泛型。

希望这解释清楚了一切。如果您同意,请标记我的答案为已接受。

混乱但是一个好的快速修复方式
如果您不想继续进行复杂的布局定义等操作,也可以使用快速修复方法来完成此操作。

在实例化适配器时声明一个内部类来完成此操作,以下是代码示例:

    ArrayAdapter<String> adapter=new ArrayAdapter<String>(
            this, android.R.layout.simple_list_item_1, listItems){

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view =super.getView(position, convertView, parent);

            TextView textView=(TextView) view.findViewById(android.R.id.text1);

            /*YOUR CHOICE OF COLOR*/
            textView.setTextColor(Color.BLUE);

            return view;
        }
    };

    /*SET THE ADAPTER TO LISTVIEW*/
    setListAdapter(adapter);

非常感谢,伙计。我从来不知道ListView有一个单独的xml文件。 - Harsha M V
这个会报错:ArrayAdapter 需要的资源 ID 必须是 TextView。你是怎么在不编写自己的适配器的情况下让它工作的? - odiggity
@odiggity,使用四个参数的构造函数而不是三个。如果您已经这样做了,那么四个参数构造函数中的第三个参数是对列表项布局中描述的TextView的ID引用,简而言之,在我的示例中,R.id.list_content是指向我的列表项布局中TextView的ID引用。 - Shardul
3
不错,这里有一个简短而直接的解决方案 - Adil Soomro
定义一个颜色需要这么长的代码,你觉得太麻烦了吧? - Jonny
它给我一个错误,即getView未定义于ListActivity中。我希望扩展ListActivity而不是Activity。 - Shachi

23
  1. 创建一个样式文件,例如:my_styles.xml 并将其保存在 res/values 中。
  2. 添加以下代码:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
    <style name="ListFont" parent="@android:style/Widget.ListView">
        <item name="android:textColor">#FF0000</item>
        <item name="android:typeface">sans</item>
    </style>
    
    </resources>
    
  3. 将你的样式添加到 AndroidManifest.xml 中的 Activity 定义中,作为一个 android:theme 属性,并将值分配为您创建的样式名称。例如:

  4. <activity android:name="your.activityClass" android:theme="@style/ListFont">
    

注意: Widget.ListView 来自这里。另请参考此处


2
我尝试了这个方法,它改变了标题栏的颜色,而不是列表项的颜色。 - mdegges
很棒,我喜欢它...因为我正在动态添加ListView中的项目。我不需要定义任何TextView... - Umesh Suryawanshi
你是否将整个ListView样式设置到活动中? - user25

16

我克隆了simple_list_item_1(使用Alt + 点击),并将副本放置在我的res/layout文件夹中,将其重命名为list_white_text.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>    
<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:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:textColor="@color/abc_primary_text_material_dark"
    android:minHeight="?android:attr/listPreferredItemHeightSmall" />

android:textColor="@color/abc_primary_text_material_dark"翻译为在我的设备上是白色。

然后在java代码中:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_white_text, myList);

这是最简单和最干净的解决方案! - sOnt
最佳解决方案!!! - Shaurya Goyal

3

您需要在定义每个项目布局的*simple_list_item_1*中定义文本颜色。

您设置了LinearLayout的背景颜色,而不是ListView的背景颜色。LinearLayout的子项的背景颜色默认情况下是透明的(在大多数情况下)。

您为TextView设置了黑色文本颜色,该TextView不是ListView的一部分。这是一个独立的项目(LinearLayout的子项目)。


1

永远不要使用getApplicationContext()。只需将您的Activity作为上下文使用。看看是否有帮助。

请在此处查看: CommonsWare answers


实际上,这是最好的解决方案。如果其他人遇到同样的问题,只需尝试一下这个。 - Akash Dahane

0

如果您没有设置活动样式,它会显示黑色背景。如果您想进行更改,例如将ListView的文本设置为黑色或白色背景,则这是一个困难的过程。

在Android清单中添加android:theme="@style/AppTheme"


0
你可以在你的代码中这样做:
final ListView lv = (ListView) convertView.findViewById(R.id.list_view);

for (int i = 0; i < lv.getChildCount(); i++) {
    ((TextView)lv.getChildAt(i)).setTextColor(getResources().getColor(R.color.black));
}

从-1点赞,如果您正确地将lv.getChildAt(i)强制转换为正确的类型,那么这将正常工作,例如在我的情况下,类型转换是AppCompatCheckedTextView。 - gregko
无法工作的解决方案 - صلي علي محمد - Atef Farouk

0

我需要创建一个带有不同颜色项目的ListView。我稍微修改了Shardul的方法,结果如下:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1, colorString) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                TextView textView = (TextView) super.getView(position, convertView, parent);
                textView.setBackgroundColor(assignBackgroundColor(position));
                textView.setTextColor(assignTextColor(position));
                return textView;
            }
        };
        colorList.setAdapter(adapter);

assignBackgroundColor()assignTextColor() 是分别用于指定背景色和文本颜色的方法。它们可以被 int[] 数组所替代。


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