Jaka jest różnica między Stanami wybranymi, sprawdzonymi i aktywowanymi w systemie Android?

Chciałbym wiedzieć, co różni te stany. Nie znalazłem żadnej strony wyjaśniającej to.

Author: Tshepang, 2012-07-16

3 answers

Różnica między sprawdzonym a aktywowanym jest całkiem interesująca. Nawet dokumentacja Google jest apologetyczna (podkreślenie poniżej dodane):

... Na przykład w widoku listy z pojedynczym lub wielokrotnym zaznaczeniem włączone, widoki w bieżącym zestawie selekcji są aktywowane. (Um, tak, bardzo nam przykro z powodu tej terminologii.) aktywowany stan jest propagowany w dół do dzieci widoku, na którym jest ustawiony.

Oto różnica:

  1. aktywowany został wprowadzony w plastrze miodu, więc nie można go używać wcześniej
  2. Activated jest teraz właściwością każdego widoku. Posiada metody setActivated () i isActivated ()
  3. aktywowany propaguje dzieci widoku, na którym jest ustawiony
  4. Checked obraca się wokół widoku implementującego interfejs Checkable. Metody setChecked(), isChecked (), toggle ()
  5. ListView (po Honeycomb) wywołuje setChecked () lub setActivated () w zależności w wersji na Androida jak poniżej (pobrane z kodu źródłowego Androida):

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

    Zwróć uwagę na zmienną mCheckStates. Śledzi, które pozycje na liście są sprawdzane / aktywowane. Są one dostępne na przykład poprzez getCheckedItemPositions (). Zauważ również, że wywołanie do ListView.setItemChecked () wywołuje powyższe. Innymi słowy, można ją również nazwać setItemActivated ().

  6. Przed Honeycomb musieliśmy wdrożyć obejścia, aby odzwierciedlić state_checked na naszej liście pozycji. Dzieje się tak dlatego, że ListView wywołuje setChecked() tylko w górnym widoku układu (a układy nie implementują funkcji checkable) ... i nie rozmnaża się bez pomocy. Te obejścia miały następującą formę: Rozszerz układ główny, aby zaimplementować Checkable. W jego konstruktorze rekurencyjnie znaleźć wszystkie dzieci, które implementują Checkable. Gdy setChecked() itd... są wywoływane, przekazać wezwanie do tych poglądów. Jeśli te widoki implementują listę stanów (np. CheckBox) z innym drawable dla state_checked wtedy stan Sprawdzony jest odzwierciedlany w interfejsie użytkownika.

  7. Aby zrobić ładne tło dla elementu listy po Honeycomb, wystarczy mieć listę stanów drawable z drawable dla stanu state_activated w ten sposób (i oczywiście użyć 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. Aby zrobić ładne tło do elementu listy przed HoneyComb należy zrobić coś takiego jak powyżej dla state_checked i trzeba również rozszerzyć swoje widok z góry, aby zaimplementować sprawdzalny interfejs. Następnie musisz powiedzieć Androidowi, czy stan, który implementujesz, jest prawdziwy czy fałszywy, implementując oncreatedrawablestate () i wywołując refreshDrawableState () za każdym razem, gdy stan się zmieni.

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

... a kod do zaimplementowania Checkable w połączeniu z state_checked w RelativeLayout może być:

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

Dzięki "following": {]}

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

Stackoverflow: Jak dodać niestandardowy stan przycisku

Stackoverflow: Niestandardowy sprawdzalny widok, który odpowiada Selektor

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/

 164
Author: Martin Harvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:43

Według doc :

  • Android: state_selected Boolean . "true " jeżeli ta pozycja ma być używana, gdy obiekt jest bieżącym wyborem użytkownika podczas nawigacji ze sterowaniem kierunkowym (np. podczas poruszania się po liście z d-pad);" false", jeżeli pozycja ta powinna być używana, gdy obiekt jest nie wybrano. Wybrany stan jest używany, gdy fokus (android: state_focused)nie wystarcza (np. gdy Widok listy ma focus i element wewnątrz niego jest wybierany za pomocą padu kierunkowego).

  • Android: state_checked Boolean . "true " jeśli ta pozycja powinna być używana, gdy obiekt jest zaznaczony; "false" Jeśli powinna być używana, gdy obiekt nie jest zaznaczony.

  • Android: state_activated Boolean . "true", jeżeli ta pozycja ma być używana, gdy obiekt jest aktywowany jako trwałe zaznaczenie (takie jak "podświetlić" wcześniej zaznaczoną pozycję listy w trwałym nawigacja view);" false", jeśli ma być stosowany, gdy obiekt nie jest aktywowany. Wprowadzono w API poziom 11.

Myślę, że doc jest całkiem jasne, więc w czym problem ?

 17
Author: AMerle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-16 13:23:32

Oto inne rozwiązanie tego problemu: https://github.com/jiahaoliuliu/CustomizedListRow/blob/master/src/com/jiahaoliuliu/android/customizedlistview/MainActivity.java

Nadpisałem metodę setOnItemClickListener i sprawdzam różne przypadki w kodzie. Ale ostatecznie rozwiązanie Marvina jest znacznie lepsze.

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;
    }
    }
});
 0
Author: jiahao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-21 15:14:19