我正在开发的应用中,希望有一个多状态的切换按钮(在我的情况下是三个状态),而不是ToggleButton
提供的两个状态。我尝试自己创建一个继承Button
的类,参考了CompoundButton
源码,但实话说阅读它的源代码有点吓人。
有没有一种方法可以使用选择器xml或其他我没有想到的方法来实现一个三态切换按钮?我很迷茫,不知道该怎么做。
我正在开发的应用中,希望有一个多状态的切换按钮(在我的情况下是三个状态),而不是ToggleButton
提供的两个状态。我尝试自己创建一个继承Button
的类,参考了CompoundButton
源码,但实话说阅读它的源代码有点吓人。
有没有一种方法可以使用选择器xml或其他我没有想到的方法来实现一个三态切换按钮?我很迷茫,不知道该怎么做。
我实现了一个多状态切换按钮,源代码在这里
它的样子是这样的:
而且使用起来非常简单:
<org.honorato.multistatetogglebutton.MultiStateToggleButton
android:id="@+id/mstb_multi_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
mstb:values="@array/planets_array" />
在您的活动中:
MultiStateToggleButton button2 = (MultiStateToggleButton) this.findViewById(R.id.mstb_multi_id);
button2.setOnValueChangedListener(new ToggleButton.OnValueChangedListener() {
@Override
public void onValueChanged(int value) {
Log.d(TAG, "Value: " + value);
}
});
您可以创建一个自定义的ImageButton来实现这一点,在这种情况下,您需要3个不同的图像。如果需要,您还可以添加更多的状态。
public class FlashButton extends ImageButton {
public enum FlashEnum {
AUTOMATIC, ON, OFF
}
public interface FlashListener {
void onAutomatic();
void onOn();
void onOff();
}
private FlashEnum mState;
private FlashListener mFlashListener;
public FlashButton(Context context, AttributeSet attrs) {
super(context, attrs);
//Sets initial state
setState(FlashEnum.AUTOMATIC);
}
@Override
public boolean performClick() {
super.performClick();
int next = ((mState.ordinal() + 1) % FlashEnum.values().length);
setState(FlashEnum.values()[next]);
performFlashClick();
return true;
}
private void performFlashClick() {
if(mFlashListener == null)return;
switch (mState) {
case AUTOMATIC:
mFlashListener.onAutomatic();
break;
case ON:
mFlashListener.onOn();
break;
case OFF:
mFlashListener.onOff();
break;
}
}
private void createDrawableState() {
switch (mState) {
case AUTOMATIC:
setImageResource(R.drawable.ic_flash_auto);
break;
case ON:
setImageResource(R.drawable.ic_flash_on);
break;
case OFF:
setImageResource(R.drawable.ic_flash_off);
break;
}
}
public FlashEnum getState() {
return mState;
}
public void setState(FlashEnum state) {
if(state == null)return;
this.mState = state;
createDrawableState();
}
public FlashListener getFlashListener() {
return mFlashListener;
}
public void setFlashListener(FlashListener flashListener) {
this.mFlashListener = flashListener;
}
}
你可以定义一个具有三个条目的选择器作为背景。问题在于,你可以使用哪些按钮属性来使用选择器。你可以有两个布尔值属性,比如A和B,并根据A、B和默认值定义选择器。(A && B将满足A,所以更准确地说它们可以被视为A、!A && B和!A && !B。) 你可以重载现有的属性(例如selected、focused等),或者更优雅地,使用这篇文章中描述的方法定义自己的自定义属性。
RadioGroup
并在内部样式化单选按钮? <RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content"
android:background="@drawable/your_drawable_selector"
android:button="@android:color/transparent"
android:gravity="center_horizontal" //center text
android:text="text"
/>
...
Chip 是一个非常好的本地选项。
<com.google.android.material.chip.ChipGroup
android:id="@+id/chip_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:singleSelection="true">
<com.google.android.material.chip.Chip
android:id="@+id/first_chip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Todo"
android:textAppearance="?android:attr/textAppearance"
android:textColor="@color/black"
android:checkable="true"
style="@style/Widget.MaterialComponents.Chip.Choice"
app:chipBackgroundColor="@color/colorAccent"/>
<!-- Second Chip -->
<!-- Third Chip -->
</com.google.android.material.chip.ChipGroup>
binding.chipGroup.setOnCheckedChangeListener { chipGroup, i ->
when (i) {
binding.firstChip -> {
binding.firstChip.setChipBackgroundColorResource(R.color.colorAccent)
}
else -> {}
}
}
binding.firstChip.isChecked = true //default
GL
Yes
到拥有切换按钮的 Activity B,我该如何将切换按钮的状态设置为选中,以便使用值Yes
? - Hoo