studio radiobutton propiedades personalizar ejemplo checklist android android-view selected checked

propiedades - radiobutton android



¿Cuál es la diferencia entre los estados seleccionados, revisados y activados en Android? (3)

Me gustaría saber qué difiere de esos estados. No encontré ninguna página web aclarando esto.


Aquí hay otra solución para este problema: https://github.com/jiahaoliuliu/CustomizedListRow/blob/master/src/com/jiahaoliuliu/android/customizedlistview/MainActivity.java

He anulado el método setOnItemClickListener y verifico diferentes casos en el código. Pero definitivamente la solución de Marvin es mucho mejor.

listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { CheckedTextView checkedTextView = (CheckedTextView)view.findViewById(R.id.checkedTextView); // Save the actual selected row data boolean checked = checkedTextView.isChecked(); int choiceMode = listView.getChoiceMode(); switch (choiceMode) { // Not choosing anything case (ListView.CHOICE_MODE_NONE): // Clear all selected data clearSelection(); //printCheckedElements(); break; // Single choice case (ListView.CHOICE_MODE_SINGLE): // Clear all the selected data // Revert the actual row data clearSelection(); toggle(checked, checkedTextView, position); //printCheckedElements(); break; // Multiple choice case (ListView.CHOICE_MODE_MULTIPLE): case (ListView.CHOICE_MODE_MULTIPLE_MODAL): // Revert the actual selected row data toggle(checked, checkedTextView, position); //printCheckedElements(); break; } } });


De acuerdo con el developer.android.com/guide/topics/resources/… :

  • android: state_selected Boolean . " true " si este elemento se debe usar cuando el objeto es la selección del usuario actual cuando se navega con un control direccional (como cuando se navega por una lista con un d-pad); " false " si este elemento se debe usar cuando el objeto no está seleccionado. El estado seleccionado se usa cuando el enfoque (android: state_focused) no es suficiente (como cuando la vista de lista tiene un foco y un elemento dentro de ella se selecciona con un d-pad).

  • android: state_checked Boolean . " true " si este elemento se debe usar cuando se marca el objeto; " false " si se debe usar cuando el objeto no está marcado.

  • android: state_activated Boolean . " true " si este elemento se debe usar cuando el objeto se activa como la selección persistente (como para "resaltar" el elemento de la lista previamente seleccionado en una vista de navegación persistente); " false " si debe usarse cuando el objeto no está activado. Introducido en el nivel 11 de la API .

Creo que el documento está bastante claro, ¿cuál es el problema?


La diferencia entre Checked y Activated es realmente bastante interesante. Incluso la documentación de Google se disculpa (se agrega el énfasis a continuación):

... Por ejemplo, en una vista de lista con selección simple o múltiple habilitada, las vistas en el conjunto de selección actual están activadas. (Um, sí, lamentamos profundamente la terminología aquí). El estado activado se propaga a los niños de la vista en la que está activado.

Así que aquí está la diferencia:

  1. Activated fue introducido en Honeycomb por lo que no puedes usarlo antes
  2. Activado ahora es propiedad de cada Vista. Tiene los métodos setActivated () y isActivated ()
  3. Se propaga activado a los niños de la Vista en la que se establece
  4. Checked gira en torno a una View que implementa la interfaz Checkable. Métodos establecidosChecked (), isChecked (), toggle ()
  5. ListView (después de Honeycomb) llama a setChecked () O setActivated () según la versión de Android que se muestra a continuación (tomada del código fuente de 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)); } }

    Tenga en cuenta la variable mCheckStates. Realiza un seguimiento de las posiciones en su lista que se controlan / activan. Estos son accesibles a través de, por ejemplo, getCheckedItemPositions (). Tenga en cuenta también que una llamada a ListView.setItemChecked () invoca lo anterior. En otras palabras, también podría llamarse setItemActivated ().

  6. Antes de Honeycomb, tuvimos que implementar soluciones para reflejar state_checked en nuestros elementos de la lista. Esto se debe a que ListView llama a setChecked () SOLAMENTE en la vista superior del diseño (y los diseños no implementan la opción de verificación) ... y NO se propaga sin ayuda. Estas soluciones provisionales tenían la siguiente forma: Extienda el diseño de la raíz para implementar Checkable. En su constructor, encuentra recursivamente todos los hijos que implementan Checkable. Cuando se llaman a setChecked () etc ..., pase la llamada a esas Vistas. Si esas vistas implementan listas de estado drawables (por ejemplo, un CheckBox) con un drawable diferente para state_checked, el estado verificado se refleja en la UI.

  7. Para hacer un buen trasfondo de un elemento de la lista después de Honeycomb, todo lo que necesita hacer es tener una lista de estado dibujable con un dibujable para el estado state_activated como este (y use setItemChecked () por supuesto):

    <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. Para hacer un buen resumen de un elemento de la lista antes de HoneyComb, haría algo como lo anterior para state_checked y TAMBIÉN necesita extender su vista superior para implementar la interfaz Checkable. Dentro de eso, debe decirle a Android si el estado que está implementando es verdadero o falso implementando onCreateDrawableState () y llamando a refreshDrawableState () cada vez que cambie el estado.

    <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"/>

... y el código para implementar Checkable combinado con state_checked en RelativeLayout podría ser:

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); } }

Gracias a lo siguiente:

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

: cómo agregar un estado de botón personalizado

: vista personalizable comprobable que responde al selector

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

developer.android.com/guide/topics/resources/…

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