在onClick之后的android按钮setPressed

时间:2011-05-12 08:14:44

标签: android button state

昨天我注意到有可能通过兼容性软件包将Fragments集成到较旧的API级别中,但这对于这个问题并不是很重要。 :)

我有一个带有OnClickListener的按钮

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        doSomething();
        button.setPressed(true);
    }
});

由于实际点击,它显示为按下,在释放点击后,按钮状态未被按下并保持这种状态。

是否有一种简单的方法可以在释放后按下按钮状态? 我能想到的第一件事就是某种计时器,但这似乎是不合理的。

7 个答案:

答案 0 :(得分:25)

请注意这是因为Android正在setPressed之前和之后更改onClickEvent,因此自行更改它无效。另一种解决方法是使用onTouchEvent

button.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        // show interest in events resulting from ACTION_DOWN
        if (event.getAction() == MotionEvent.ACTION_DOWN) return true;

        // don't handle event unless its ACTION_UP so "doSomething()" only runs once.
        if (event.getAction() != MotionEvent.ACTION_UP) return false;

        doSomething();
        button.setPressed(true);                    
        return true;
   }
});

答案 1 :(得分:13)

使用ToggleButton代替Button

<ToggleButton
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:background="@drawable/topping_selector"
    android:checked="false"
    android:textOff="Topping2"
    android:textOn="Topping2" />

topping_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="true" 
        android:drawable="@drawable/btn_topping_on" />

    <item android:state_checked="false" 
        android:drawable="@drawable/btn_topping_off" />

</selector>

答案 2 :(得分:6)

您可以将按钮状态保留在xml文件的drawable文件夹下,然后用作按钮的背景。 例如:

 android:background="@drawable/buttonstate"

buttonstate.xml

<?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/back_focused" />
    <item android:drawable="@drawable/back" /> <!-- default -->
</selector>

答案 3 :(得分:3)

更好的解决方案:

在xml文件中:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_activated="true">
        <bitmap android:src="@drawable/image_selected"/>
    </item>
    <item>
        <bitmap android:src="@drawable/image_not_selected"/>
    </item>
</selector>

在java中:

@Override
public void onClick(View v) {
   v.setActivated(!v.isActivated());
}

答案 4 :(得分:3)

您可以使用 android.os.Handler 类。丑陋,但也有效:

final Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        doSomething();
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                button.setPressed(true);
            }
        });
    }
});

答案 5 :(得分:0)

另一种解决方案是扩展Button并覆盖setPressed(boolean pressed)方法,以便您可以使用标志处理来自onClickEvent的平台调用,例如根据您的需要更改布尔压缩参数。

public class MyButton extends Button {
   boolean isSelected = false;  //this is your flag
   @Override
   public void setPressed(boolean pressed) {
       if(isSelected) {
           //here you change the parameter so it stays pressed
           super.setPressed(true);
           return;
       }
       super.setPressed(pressed);
   }

   public void setIsSelected(boolean selected) {
       this.isSelected = selected;
   }

   public MyButton(Context context) {
       super(context);
   }
}

答案 6 :(得分:0)

这是我使用的解决方案,它目前也适用于Android 7.0。

<强> YourActivity.java

public void onStandbyStart(String message) {
    startStandbyBtn.setActivated(true);
}

public void onBackOnline(String message) {
    startStandbyBtn.setActivated(false);
}

<强> YourActivityLayout

<Button
        ...
        style="@style/generic_btn_style"
        ... />

<强>值/ styles.xml

    <style name="generic_btn_style" parent="@android:style/Widget.Button">
        <item name="android:gravity">center_vertical|center_horizontal</item>
        <item name="android:background">@drawable/generic_btn</item>
        <item name="android:textColor">@color/selector_white_black</item>
        <item name="android:focusable">true</item>
        <item name="android:clickable">true</item>
</style>

<强>抽拉/ generic_btn.xml 此选择器选择按钮背景。我使用按下作为激活。

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/generic_btn_disabled" android:state_enabled="false" />
    <item android:drawable="@drawable/generic_btn_pressed" android:state_enabled="true" android:state_pressed="true" />
    <item android:drawable="@drawable/generic_btn_pressed" android:state_activated="true" />
    <item android:drawable="@drawable/generic_btn_focused" android:state_enabled="true" android:state_focused="true" />
    <item android:drawable="@drawable/generic_btn_enabled" android:state_enabled="true" />
</selector>

<强>颜色/ selector_black_white 在这里我设置文本颜色。在我的情况下,我需要在按下时选择textcolor black。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#fff" android:state_pressed="true" /> <!-- pressed -->
    <item android:color="#fff" android:state_activated="true" /> <!-- pressed -->
    <item android:color="#000" /> <!-- default -->
</selector>