私が取り組んでいるアプリでは、ToggleButton
が提供する2つではなく、複数の状態(私の場合は3つ)のトグルボタンが必要です。 Button
ソースに続いてCompoundButton
を拡張する独自のものを開始しようとしましたが、正直に言って、そのソースを読むのは少し圧倒されました。
セレクターXMLなどを使用してスリーステートトグルボタンを実行する方法、またはおそらく私が考えていなかった別の方法はありますか?私はこれを行う方法がかなり途方に暮れています。
確かに、3つのエントリを持つ背景として使用するセレクターを定義できます。問題は、セレクターに使用できるボタン属性です。 AとBの2つのブール属性を設定し、A、B、およびデフォルトの観点からセレクターを定義できます。 (A && BはAを満たすので、より適切にはA、!A && B、および!A &&!Bと考えることができます。)既存の属性(選択、フォーカスなど)をオーバーロードするか、よりエレガントに、説明されているレシピを使用して独自のカスタム属性を定義します このスレッドで 。
マルチステートトグルボタンを実装しました。ソースコードは ここ です。
これはそれがどのように見えるかです:
そしてそれを使用することは非常に簡単です:
<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;
}
}
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"
/>
...