[解決済み] Androidのselected, checked, activatedの違いは何ですか?
質問
この2つの州は何が違うのか知りたいです。これを明確にしたウェブページは見つかりませんでした。
どのように解決するのですか?
CheckedとActivatedの違いは、実はとても興味深いものです。Google のドキュメントでさえ、申し訳なさそうにしています (以下、強調を追加)。
... たとえば、単一選択または複数選択を有効にしたリスト ビューで が有効な場合、現在の選択セット内のビューが有効になります。 (えーと。 ええ、ここでの用語については深く反省しています)。 アクティブ化された の状態は、それが設定されているビューの子へ伝搬されます。
では、ここが違うところです。
- ActivatedはHoneycombで導入されたので、それ以前は使用できない
- Activatedは現在、すべてのViewのプロパティです。setActivated() と isActivated() メソッドを持ちます。
- Activated は、それが設定された View の子に伝搬します。
- Checkedは、Checkableインタフェースを実装したViewを中心に展開されます。メソッド setChecked()、isChecked()、toggle()。
-
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()と呼ばれることができます。
-
Honeycomb以前は、リストアイテムにstate_checkedを反映させるために回避策を実装する必要がありました。これは、ListView が setChecked() をレイアウトの最上位のビューでのみ呼び出し (レイアウトは checkable を実装していない) ... 助けなしに伝搬しないためです。これらの回避策は、以下のような形でした。ルートレイアウトを拡張し、Checkableを実装する。そのコンストラクタで、Checkableを実装しているすべての子要素を再帰的に見つけます。setChecked() などが呼び出されたら、その呼び出しをそれらのビューに渡します。それらのビューが state_checked に対して異なる drawable を持つ state list drawable (例: CheckBox) を実装している場合、チェックされた状態が UI に反映されます。
-
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"/>
-
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/
関連
-
[解決済み] Androidのgravityとlayout_gravityの違いは何ですか?
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] match_parentとfill_parentの違いは何ですか?
-
[解決済み] compileSdkVersionとtargetSdkVersionの違いは何ですか?
-
[解決済み] Androidにおける"@id/"と"@+id/"の違いについて
-
[解決済み] Android Contextを取得するための様々な方法の違いは何ですか?
-
[解決済み】「px」、「dip」、「dp」、「sp」の違いは?
-
[解決済み] バイト配列の画像ファイルをビットマップに変換するには?
-
[解決済み] アンドロイドのクライアントでヒープアップデートを有効にする方法
-
[解決済み] react nativeアプリのバージョン番号を更新する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] カスタムボタンの状態を追加する方法
-
[解決済み] RecyclerView.Stateを使って、RecyclerViewのスクロール位置を保存するには?
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] 「KotlinとAndroidで「パラメータTを推測するのに十分な情報がありません。
-
[解決済み] wrap_contentでRelativeLayoutがフルスクリーンになってしまう
-
[解決済み] Android Studio - あいまいなメソッド呼び出し getClass()
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] 通知をクリックした後にアプリケーションを開く
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] Android - Snackbar vs Toast - 使い方と違い。