按下按钮状态按下时不按预期工作

时间:2017-01-24 00:54:27

标签: android android-layout android-button

我有一个“赞”按钮,用户可以点击“喜欢”某些东西(类似于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" />

问题是,当我抬起手指时,文字颜色不会保持红色,当我用手指按住按钮时,它只会变为红色。

我应该改变什么?

4 个答案:

答案 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监听器应该开始执行作业,最后按下的按钮应该变得不可见。

希望这个例子可以澄清。