更改drawable时,Android按钮仍保持按下状态

时间:2013-05-30 10:24:57

标签: android user-interface android-drawable

我想创建一个按钮,在第一次按下时变为红色,然后在第二次按下时恢复正常灰色(并执行删除文件等操作)。这是一种确认用户确实想要启动删除操作的方法。

为此,我将背景drawable更改为LayerDrawable,并在默认drawable之上添加了一个额外的ColorDrawable。然后根据状态将ColorDrawable的alpha设置为0或255。

第一次点击时切换为红色,但第二次点击时按钮变为黄色,如同处于按下状态时一样,它应该恢复正常灰色。

演示代码:

package com.example.test;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class TestActivity extends Activity {

    Button button;
    boolean showRed;
    ColorDrawable cd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        button = new Button(this);
        button.setText("Delete");

        // Following two lines don't matter, focus isn't the problem
        button.setFocusable(false);
        button.setFocusableInTouchMode(false);

        cd = new ColorDrawable(0xffff0000);
        cd.setAlpha(0);

        button.setBackgroundDrawable(new LayerDrawable(new Drawable[] {
                button.getBackground(), cd}));

        setContentView(button);


        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                showRed = !showRed;

                if (showRed)
                    cd.setAlpha(255);
                else
                    cd.setAlpha(0);

                // Following line doesn't matter
                button.setSelected(false);

                button.getBackground().invalidateSelf();
            }
        });
    }
}

3 个答案:

答案 0 :(得分:0)

我认为通过使用切换按钮代替普通按钮并为其提供背景,可以轻松完成您要实现的目标。

切换按钮可以处理您要切换的第一次单击和第二次单击问题。

我所说的是使用拨动开关代替普通按钮然后根据您的情况你可以做两件事:

1>将切换按钮背景分配给选择器xml文件,该文件将处理不同状态的颜色(按下,聚焦,默认等)。对于州,请检查开发者网站上的文档。

2>您可以为背景指定默认颜色,然后您可以更改颜色以切换已选中和未选中的功能。

我建议切换按钮的唯一原因是它很容易处理第一次点击和第二次点击选项。

此外,只要您将切换按钮背景更改为任何颜色或默认情况下可绘制,它就不会再像切换一样显示。您还可以通过将textOn和textOff属性保持为空白

来删除写入的打开和关闭
<ToggleButton
    android:id="@+id/toggleButton1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignRight="@+id/textView1"
    android:layout_below="@+id/textView1"
    android:layout_marginTop="42dp"
    android:text="ToggleButton"
    android:background="@android:color/white"
    android:textOn=""
    android:textOff="" />

答案 1 :(得分:0)

为什么不使用选择器将选择器放在drawable文件夹中。 这是假设你的button_state.xml在drawable文件夹中。

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
     android:drawable="@drawable/button_pressed" /> <!-- pressed -->
     <item android:state_focused="true"
     android:drawable="@drawable/button_focused" /> <!-- focused -->
     <item android:drawable="@drawable/button_normal" /> <!-- default -->
 </selector>

然后在按钮中添加以下内容:

<Button
        android:id="@+id/homeButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10px"
        android:background="@drawable/button_state" />

答案 2 :(得分:0)

现在我自己找到了答案:每个Drawable引用一个Callback对象,如果需要重绘,则会通知该对象。如果将drawable分配给View,则此View是Callback,如果它是复合drawable的一部分(如LayerDrawable),则此化合物是Callback。

代码行

    button.setBackgroundDrawable(new LayerDrawable(new Drawable[] {
            button.getBackground(), cd}));

现在首先将按钮的默认drawable放入LayerDrawable中(因此默认背景的Callback设置为LayerDrawable)。然后用新创建的Drawable替换按钮的默认背景。发生这种情况时,前一个Drawable的Callback设置为null。

最后,默认背景没有Callback来通知状态更改后必要的重绘并保持(视觉上)处于错误状态。

正确的做法是:

    Drawable oldBg = button.getBackground();
    button.setBackgroundDrawable(null);
    button.setBackgroundDrawable(new LayerDrawable(
            new Drawable[] {oldBg, cd}));

首先“断开”默认背景,然后创建并设置新背景。