android - एंड्रॉइड में चयनित, चेक और सक्रिय राज्यों के बीच क्या अंतर है?




android-view selected (2)

इस समस्या के लिए यहां अन्य समाधान दिया गया है: https://github.com/jiahaoliuliu/CustomizedListRow/blob/master/src/com/jiahaoliuliu/android/customizedlistview/MainActivity.java

मैंने विधिOnItemClickListener विधि को ओवरराइड किया है और कोड में differente मामलों की जांच की है। लेकिन निश्चित रूप से मार्विन का समाधान बहुत बेहतर है।

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

मैं जानना चाहता हूं कि उन राज्यों में क्या अंतर है। मुझे यह स्पष्ट करने वाला कोई वेबपृष्ठ नहीं मिला।


चेक और सक्रिय के बीच का अंतर वास्तव में काफी दिलचस्प है। यहां तक ​​कि Google प्रलेखन भी क्षमाप्रार्थी है (नीचे जोड़ा गया जोर):

... उदाहरण के लिए, एकल या एकाधिक चयन सक्षम के साथ सूची दृश्य में, वर्तमान चयन सेट में दृश्य सक्रिय हैं। (उम, हाँ, हम यहां शब्दावली के बारे में बहुत खेद हैं।) सक्रिय राज्य को इस दृश्य के बच्चों के लिए प्रचारित किया जाता है।

तो यहां अंतर है:

  1. हनीकॉम्ब में सक्रिय किया गया था ताकि आप इससे पहले इसका उपयोग न कर सकें
  2. सक्रिय अब हर दृश्य की संपत्ति है। इसमें विधियां सेट की गई हैं () और सक्रिय है ()
  3. व्यू के बच्चों को सक्रिय प्रचारित करता है जिस पर यह सेट किया गया है
  4. जांच योग्य इंटरफ़ेस को कार्यान्वित करने के दृश्य के चारों ओर घूमता है। सेट किए गए तरीके चेक (), चेक किया गया है (), टॉगल ()
  5. ListView (हनीकॉम के बाद) नीचे सेट एंड्रॉइड संस्करण (एंड्रॉइड स्रोत कोड से लिया गया) के आधार पर सेट चेक () या setActivated () सेट करता है:

    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.setItem चेक किए गए कॉल () उपरोक्त को आमंत्रित करता है। दूसरे शब्दों में, इसे समान रूप से setItemActivated () कहा जा सकता है।

  6. हनीकॉम से पहले हमें अपनी सूची वस्तुओं में राज्य_चेक्टेड को प्रतिबिंबित करने के लिए वर्कअराउंड लागू करना था। ऐसा इसलिए है क्योंकि ListView कॉल को चेक किया गया है () केवल लेआउट में शीर्ष पर देखें (और लेआउट चेक करने योग्य लागू नहीं होते हैं) ... और यह बिना किसी मदद के प्रसारित नहीं करता है। ये कामकाज निम्न रूपों में से थे: चेकबल लागू करने के लिए रूट लेआउट बढ़ाएं। अपने कन्स्ट्रक्टर में, चेक करने योग्य लागू करने वाले सभी बच्चों को दोबारा ढूंढें। जब सेट चेक () आदि ... कहा जाता है, तो उन दृश्यों पर कॉल पास करें। यदि वे विचार राज्य सूची ड्रॉबल्स (उदाहरण के लिए एक चेकबॉक्स) को लागू करते हैं, तो राज्य_चेक्ड के लिए अलग-अलग ड्रायबल के साथ, चेक की गई स्थिति यूआई में दिखाई देती है।

  7. हनीकॉम्ब के बाद एक सूची आइटम में एक अच्छी पृष्ठभूमि करने के लिए आपको बस इतना करना है कि राज्य की स्थिति के लिए एक ड्रायबल के साथ एक राज्य सूची ड्रायबल है (और निश्चित रूप से 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. हनीकॉम्ब से पहले एक सूची आइटम में एक अच्छी पृष्ठभूमि करने के लिए आप उपरोक्त की तरह कुछ राज्य_चेक्ड के लिए करेंगे और आपको चेक करने योग्य इंटरफ़ेस को लागू करने के लिए अपने शीर्ष दृश्य को भी विस्तारित करने की आवश्यकता है। इसके भीतर आपको एंड्रॉइड को यह बताने की ज़रूरत है कि क्या राज्य जिसे आप कार्यान्वित कर रहे हैं, वह हैक्रेट ड्रायबलस्टेट () पर लागू करके सत्य या गलत है और जब भी राज्य बदलता है तो रीफ्रेश ड्रायबलस्टेट () को कॉल करना।

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

... और एक रिलेवेटिवआउट में state_checked के साथ संयुक्त चेकबल लागू करने के लिए कोड हो सकता है:

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/

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

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





checked