昨天我注意到有可能通过兼容性软件包将Fragments集成到较旧的API级别中,但这对于这个问题并不是很重要。 :)
我有一个带有OnClickListener的按钮
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
doSomething();
button.setPressed(true);
}
});
由于实际点击,它显示为按下,在释放点击后,按钮状态未被按下并保持这种状态。
是否有一种简单的方法可以在释放后按下按钮状态? 我能想到的第一件事就是某种计时器,但这似乎是不合理的。
答案 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>