我有一个“赞”按钮,用户可以点击“喜欢”某些东西(类似于Facebook)。
我需要这样做,以便在用户喜欢的东西之后,按钮的文字颜色变为红色。
现在是我的代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:color="@color/red" />
<item
android:color="@color/normal" />
</selector>
按钮:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Like"
android:textColor="@drawable/like_button" />
问题是,当我抬起手指时,文字颜色不会保持红色,当我用手指按住按钮时,它只会变为红色。
我应该改变什么?
答案 0 :(得分:3)
根据您的代码,您专门使用:
android:state_pressed="true"
这基本上意味着它在按下时只是红色,因此你得到的结果
来源:https://developer.android.com/guide/topics/resources/color-list-resource.html
您需要包含在您的活动(Java)
中Button likeButton = (Button) findViewById(R.id.like_button);
likeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(likeButton.isSelected())
likeButton.setSelected(false);
else
likeButton.setSelected(true);
}
});
您需要包含在您的布局(XML)
中<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/red" android:state_selected="true"/>
<item android:color="@color/red" android:state_pressed="true"/>
<item android:color="@color/normal" android:state_pressed="false"/>
<item android:color="@color/normal"/>
</selector>
<Button
android:id="@+id/like_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/like"
android:layout_gravity="center"
android:text="@string/like" />
干杯。
答案 1 :(得分:0)
为了“保存”“喜欢”的“状态”,你必须使用一些布尔指示符更新按钮后面的数据模型/数据库,该指示符显示“是,现在已经喜欢/不喜欢”。
您的XML选择器仅显示“按此按钮时更改颜色,否则还原”,它没有逻辑说“现在已经喜欢”。
答案 2 :(得分:0)
你只是说明状态按下按钮的状态。这就是为什么,只有当你按下它时才会变红。如果你想在按下按钮后用红色制作文字,那么你应该在drawable中添加选择器,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color=""@color/red" android:state_selected="true"/>
<item android:color=""@color/red" android:state_pressed="true"/>
<item android:color="@color/normal" android:state_pressed="false"/>
<item android:color="@color/normal"/>
</selector>
在您的活动中,输入以下代码:
final Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(button.isSelected())
button.setSelected(false);
else
button.setSelected(true);
}
});
这将选择按钮并将文本颜色更改为红色,如果已经选择了按钮,它将更改为正常。如果您只想在单击时保持选中按钮,您只需在OnClickListener中添加此行
button.setSelected(true);
答案 3 :(得分:0)
state_pressed是一种让你知道按钮是否真的被按下的机制。这类似于在真正单击虚拟键盘中的键时发出一点声音的情况。
由于我不知道你的情况的全部故事,我想可能MVC模式适合你的情况。
例如,在后端,有一个数据存储了likes = true或false。
在视图中,有两个按钮:likeButton和differentButton。当喜欢== false时,likeButton是可见的,而不像按钮是不可见的。当喜欢== true时,likebutton是不可见的,而且不同于按钮是可见的。
likeButton的onClick侦听器和不同的按钮是设置数据like = true或false。
likeButton和differentButton都可以使用state_pressed将按钮颜色更改为红色,以便让用户知道按钮已被按下并被按下。但是,无论如何,一旦按下按钮后释放按钮,onClick监听器应该开始执行作业,最后按下的按钮应该变得不可见。
希望这个例子可以澄清。