23

FrameLayoutチェック可能/選択可能にしたいグループがあり、

つまり、クリックした後、 を次のようFrameLayoutに表示したいchecked- もう一度押すと、 un になりたいchecked。さらに、このビジュアル キューは、<selector>.

これが機能していないようです-何が欠けているのかわかりません:

public class CheckableFrameLayout extends FrameLayout implements Checkable {
    private boolean mChecked = false;
    public CheckableFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setChecked(boolean checked) {
        mChecked = checked;
        refreshDrawableState();
    }

    public boolean isChecked() {
        return mChecked;
    }

    public void toggle() {
        setChecked(!mChecked);
    }
}

のレイアウトCheckableFrameLayout:

<com.test.view.CheckableFrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/selector_horizontal"
    android:clickable="true" >

それを支えるセレクター (selector_horizo​​ntal.xml):

<item android:drawable="@drawable/selector_vertical_selected" android:state_pressed="false" android:state_checked="true"/>  
<item android:drawable="@drawable/selector_vertical_pressed" android:state_pressed="true" android:state_checked="false"/>
<item android:drawable="@drawable/selector_vertical_normal" android:state_pressed="false" android:state_checked="false"/>

上記のコードを使用すると、「state_pressed」は正常に動作していますが、ビュー自体はチェックされていません (Checkableデバッグによって検出されたコードは呼び出されていません)。

4

6 に答える 6

31

次のコードをCheckableクラスに追加すると、セレクターが機能します。

private static final int[] CheckedStateSet = {
    android.R.attr.state_checked,
};

@Override
protected int[] onCreateDrawableState(int extraSpace) {
    final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
    if (isChecked()) {
        mergeDrawableStates(drawableState, CheckedStateSet);
    }
    return drawableState;
}

@Override
public boolean performClick() {
    toggle();
    return super.performClick();
}
于 2012-07-02T13:36:10.953 に答える
4

CheckableButton の完全な動作例を次に示します。Android 4.2 でも動作します。

public class CheckableButton extends Button implements Checkable {

    private static final int[] CheckedStateSet = { android.R.attr.state_checked };

    private boolean mChecked = false;

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

    public CheckableButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CheckableButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void setChecked(boolean checked) {
        mChecked = checked;
        refreshDrawableState();
    }

    @Override
    public void toggle() {
        mChecked = !mChecked;
        refreshDrawableState();
    }

    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CheckedStateSet);
        }
        return drawableState;
    }
}
于 2013-01-22T15:09:56.957 に答える
0

上記のGraemeの回答に加えて、toggle()に次の変更を加えます

@Override
public void toggle() {
    mChecked = !mChecked;
    refreshDrawableState();
}
于 2012-07-03T07:14:29.230 に答える
0

タグを並べ替えてみてくださいselector_horizontal.xmlこれらは上から下に評価されます。あなたの場合、どちらかandroid:state_pressed="false" or android:state_pressed="true"が適用され、評価がandroid:state_checked="true"最初の行を最後に移動してみてください:

<item android:drawable="@color/HighlightColor" android:state_pressed="true"/>
<item android:drawable="@color/selected_color" android:state_checked="true"/>
<item android:drawable="@android:color/transparent" android:state_pressed="false"/>
于 2012-07-02T12:38:45.020 に答える
0

Graeme のソリューションは、Android 4.0.3 では機能しません (4.0 でも機能しないと思います)。state_checked代わりに、次のように変更できますstate_activated

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

    <item android:drawable="@drawable/activated_image" android:state_pressed="false" android:state_activated="true" />
    <item android:drawable="@drawable/not_activated_image" android:state_pressed="false" android:state_activated="false"/>

</selector>

あなたの中で使用setActivatedしますsetChecked

@Override
public void setChecked(boolean checked) {
    mChecked = checked;
    setActivated(checked);
}

それだけです。ここでは実装onCreateDrawableStateする必要はありません。

于 2012-07-27T06:28:17.127 に答える
0

を使ってみてくださいandroid:state_activated

<item android:drawable="@color/HighlightColor"      android:state_activated="true"/> 

ドキュメントから:

StateListDrawable の状態値。ビューまたはその親が「アクティブ化」されたときに設定されます。これは、ユーザーが現在関心のあるものとしてマークしていることを意味します。

于 2012-07-02T12:19:24.677 に答える