文本颜色选择器不起作用。

16

我之前做过这个。我复制粘贴了代码,并从网上复制了许多其他示例。我只是无法使文本颜色选择器正常工作。它将默认颜色设置为文本视图,但如果您单击文本视图,则不会更改。背景的settings_selector可以正常工作。

这是布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/settings_selector"
    android:clickable="true"
    android:id="@+id/llRecentChanges"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:paddingLeft="5dp">
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/llRecentChanges2"
        android:layout_weight="1"
        android:layout_gravity="center_vertical">
    <TextView
        android:id="@+id/tvAbout"
        android:text="@string/settings_recentchanges"
        android:gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16dp"
        android:textColor="@drawable/settings_selector_txt" >
    </TextView>
    <TextView
        android:id="@+id/tvAbout2"
        android:text="@string/settings_recentchanges2"
        android:gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@drawable/settings_selector_txt"
        android:textSize="10dp">
    </TextView>
    </LinearLayout>

</LinearLayout>

这是settings_selector_txt的xml代码:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" 
          android:state_pressed="false" 
          android:color="#FFFFFF" />
    <item android:state_focused="true" 
          android:state_pressed="true"
          android:color="#ffa800" />
    <item android:state_focused="false" 
          android:state_pressed="true"
          android:color="#ffa800" />
    <item android:color="#FFFFFF" />
</selector>
或者这个。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true" android:color="#444"/>
    <item android:state_focused="true" android:color="#444"/>
    <item android:state_pressed="true" android:color="#444"/>
    <item android:color="#ccc"/>

</selector>

或者这个

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:color="#ffffff" />
    <item android:state_focused="true" android:state_pressed="true" android:color="#000000" />
    <item android:state_focused="false" android:state_pressed="true" android:color="#000000" />
    <item android:color="#ffffff" />
</selector>

它们都不起作用。将选择器 XML 放到颜色文件夹中也无解决方案。有什么想法吗?


1
如果这些答案有用,请接受;如果它们没有用,请评论并说明原因。 - AliSh
请查看此链接:https://dev59.com/kIXca4cB1Zd3GeqPESvj#55904776 - Wendel086
5个回答

39

确保你的TextView已经准备好监听你所应用的状态。例如,如果要达到"state_pressed"状态,你的textView应该是可以被点击的:

android:clickable="true"

编辑:完成了。这个布局可以实现目标效果。请注意,收集点击事件的视图是LinearLayout,但由于“duplicateParentState”设置为true,TextView也会重复它。颜色选择器将处理不同状态下的颜色。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/testLlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:clickable="true" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@drawable/textview_selector"
        android:duplicateParentState="true"
        android:text="TextView" />

</LinearLayout>

以下是颜色选择器的代码。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true" android:color="#444"/>
    <item android:state_focused="true"  android:color="#444"/>
    <item android:state_pressed="true"  android:color="#444"/>
    <item android:color="#ccc"/>

</selector>

就是这样了。


1
好的,我不知道那个。那么你需要在文本视图中从父视图继承状态,通过在你需要的所有视图中添加 "android:duplicateParentState="true""。 - Jose L Ugia
请确保将父布局(在这种情况下为LinearLayout)的clickable属性设置为true。 - Jose L Ugia
你不需要为LinearLayout添加颜色选择器。 想法是TextView将采用其父级(在此情况下为LinearLayout)的状态。这就是为什么我们需要向TextView添加duplicateParentState的原因。我们想要达到的状态,也是我们拥有选择器的状态,是按下状态。我们只想让我们的TextView达到这个状态,这样唯一需要选择器的视图就是那个(我们的TextView)。 没有其他需要的东西。如果你还需要更多帮助,我可以给你一些代码。但最好猜一下 ;) - Jose L Ugia
我真的不知道该怎么做才能让它工作。请帮忙提供一段代码。 - erdomester
我认为值得注意的是,在这些选择器中,您不能使用引用颜色(至少在API 19之前是这样)。这些必须是以#开头的十六进制数字。我花了一段时间才通过Eclipse工具提示注意到android:color必须是十六进制的。 - frenziedherring
显示剩余4条评论

29

不需要将 android:clickable="true"android:duplicateParentState="true" 设置到 TextView 上。

解决方案:
步骤1:在res/color文件夹下定义您的颜色选择器(Jose L Ugia的颜色选择器非常好)
步骤2:将此颜色选择器设置为您的 TextView 的文本颜色,如android:textColor="@color/m_text_selector"(而不是 @drawable/*!!!)

注意:如果要以编程方式设置文本颜色选择器,则必须将其作为颜色状态列表获取,而不是颜色;

textView.setTextColor(getResources().getColorStateList(R.color.m_text_selector));


就这些。


我之前使用的是 -> item android:drawable="@color/white",但在选择器中应该是 item android:color="@color/white"... 感谢 @Devrim。 - varotariya vajsi

2

我认为在Android的旧版本和最新版本中使用ColorStateList是最好的选择。

int[][] states = new int[][] {
    new int[] { android.R.attr.state_pressed}, // pressed
    new int[] { android.R.attr.state_focused}, // focused
    new int[] {}
};
int[] colors = new int[] {
    getResources().getColor(R.color.green_color), // green
    getResources().getColor(R.color.green_color), // green
    getResources().getColor(R.color.white)  // white
};
ColorStateList list = new ColorStateList(states, colors);
mTextView.setFocusable(true);
mTextView.setClickable(true);
mTextView.setTextColor(list);

有多个状态设置为true怎么样?例如,focusedselected是2种状态,因此我们有4种组合。数组的顺序如何确定? - JCarlosR

1
确保在“可点击”布局之前可能包含您的TextView的所有布局也具有duplicateParentState =“true”,否则,文本视图将无法达到您想要的元素状态。

0
你必须在你的代码中设置:android:clickable="true"才能使TextView可点击。

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