1. ホーム
  2. android

[解決済み] Androidのselected, checked, activatedの違いは何ですか?

2022-08-15 21:38:24

質問

この2つの州は何が違うのか知りたいです。これを明確にしたウェブページは見つかりませんでした。

どのように解決するのですか?

CheckedとActivatedの違いは、実はとても興味深いものです。Google のドキュメントでさえ、申し訳なさそうにしています (以下、強調を追加)。

... たとえば、単一選択または複数選択を有効にしたリスト ビューで が有効な場合、現在の選択セット内のビューが有効になります。 (えーと。 ええ、ここでの用語については深く反省しています)。 アクティブ化された の状態は、それが設定されているビューの子へ伝搬されます。

では、ここが違うところです。

  1. ActivatedはHoneycombで導入されたので、それ以前は使用できない
  2. Activatedは現在、すべてのViewのプロパティです。setActivated() と isActivated() メソッドを持ちます。
  3. Activated は、それが設定された View の子に伝搬します。
  4. Checkedは、Checkableインタフェースを実装したViewを中心に展開されます。メソッド setChecked()、isChecked()、toggle()。
  5. ListView(Honeycomb以降)は、Androidのバージョンに応じて、以下のようにsetChecked() or setActivated()を呼び出します(Androidソースコードより抜粋)。

    if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {
        if (child instanceof Checkable) {
            ((Checkable) child).setChecked(mCheckStates.get(position));
        } else if (getContext().getApplicationInfo().targetSdkVersion
                >= android.os.Build.VERSION_CODES.HONEYCOMB) {
            child.setActivated(mCheckStates.get(position));
        }
    }
    
    

    mCheckStates変数に注目してください。これは、リスト内のどの位置がチェックされたか、またはアクティブになったかを記録します。これらは、例えば、getCheckedItemPositions()を介してアクセスできます。ListView.setItemChecked()の呼び出しは、上記を呼び出していることにも注意してください。言い換えれば、それは同様にsetItemActivated()と呼ばれることができます。

  6. Honeycomb以前は、リストアイテムにstate_checkedを反映させるために回避策を実装する必要がありました。これは、ListView が setChecked() をレイアウトの最上位のビューでのみ呼び出し (レイアウトは checkable を実装していない) ... 助けなしに伝搬しないためです。これらの回避策は、以下のような形でした。ルートレイアウトを拡張し、Checkableを実装する。そのコンストラクタで、Checkableを実装しているすべての子要素を再帰的に見つけます。setChecked() などが呼び出されたら、その呼び出しをそれらのビューに渡します。それらのビューが state_checked に対して異なる drawable を持つ state list drawable (例: CheckBox) を実装している場合、チェックされた状態が UI に反映されます。

  7. Honeycomb 以降のリストアイテムに美しい背景を付けるために必要なことは、このような state_activated のための drawable を持つ状態リスト drawable を持つことです (そしてもちろん setItemChecked() を使用します)。

    <item android:state_pressed="true"
        android:drawable="@drawable/list_item_bg_pressed"/>
    <item android:state_activated="true"
        android:drawable="@drawable/list_item_bg_activated"/>
    <item android:drawable="@drawable/list_item_bg_normal"/>
    
    

  8. HoneyComb以前のリストアイテムに素敵な背景を付けるには、state_checkedに対して上記のようなことを行い、さらに最上位のビューを拡張してCheckableインターフェイスを実装する必要があります。その中で、onCreateDrawableState() を実装し、状態が変わるたびに refreshDrawableState() を呼び出すことで、実装している状態が true か false かを Android に知らせる必要があります。

    <item android:state_pressed="true"
        android:drawable="@drawable/list_item_bg_pressed"/>
    <item android:state_checked="true"
        android:drawable="@drawable/list_item_bg_checked"/>
    <item android:drawable="@drawable/list_item_bg_normal"/>
    
    

... そして、RelativeLayoutでstate_checkedと組み合わせたCheckableを実装するコードは、次のようになります。

public class RelativeLayoutCheckable extends RelativeLayout implements Checkable {

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

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

    private boolean mChecked = false;

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
    }
    @Override
    public boolean isChecked() {
        return mChecked;
    }

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

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

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

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

以下の方に感謝します。

http://sriramramani.wordpress.com/2012/11/17/custom-states/

スタックオーバーフロー カスタムボタンの状態を追加する方法

スタックオーバーフロー セレクタに応答するカスタム チェック可能ビュー

http://www.charlesharley.com/2012/programming/custom-drawable-states-in-android/

http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList

http://blog.marvinlabs.com/2010/10/29/custom-listview-ability-check-items/