Android में चयनित, जाँच और सक्रिय किए गए राज्यों के बीच अंतर क्या है?


114

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


4
एक दृश्य के राज्य (उदाहरण के लिए एक सूची दृश्य आइटम) developer.android.com/guide/topics/resources/…
लुईस

stackoverflow.com/questions/13634259/… एक ऐसा ही सवाल है जिसने मुझे इसे समझने में बेहतर मदद की। यदि आप अधिक सीखना चाहते हैं, तो इसे देखें।
अकसर

जवाबों:


182

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

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

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

  1. एक्टिवेट को हनीकॉम्ब में पेश किया गया था ताकि आप उससे पहले इसका इस्तेमाल न कर सकें
  2. सक्रिय अब प्रत्येक दृश्य की एक संपत्ति है। इसकी विधियाँ निर्धारित हैं () और सक्रिय ()
  3. सक्रिय उस दृश्य के बच्चों को प्रचारित करता है जिस पर वह सेट है
  4. चेक किया गया देखें चेक करने योग्य इंटरफ़ेस को लागू करने वाले दृश्य के चारों ओर घूमता है। तरीके सेट किए गए (), isChecked (), टॉगल ()
  5. ListView (Honeycomb के बाद) setChecked () या setActivated () नीचे दिए गए Android संस्करण के आधार पर (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. हनीकॉम्ब से पहले हमें अपनी सूची आइटम में स्टेट_चेक करने को दर्शाने के लिए वर्कआर्ड को लागू करना था। ऐसा इसलिए है क्योंकि ListView कॉल सेट की गई () केवल लेआउट में सबसे ऊपरी दृश्य पर है (और लेआउट चेक करने योग्य नहीं हैं) ... और यह मदद के बिना प्रचार नहीं करता है। ये वर्कअराउंड निम्न रूप में थे: चेकेबल को लागू करने के लिए रूट लेआउट का विस्तार करें। इसके निर्माता में, पुनरावर्ती सभी बच्चों को खोजते हैं जो चेकेबल को लागू करते हैं। जब सेटचेक () आदि ... कहते हैं, तो उन दृश्यों पर कॉल पास करें। यदि वे दृश्य राज्य सूची ड्राबल्स (उदाहरण के लिए एक चेकबॉक्स) को लागू करते हैं, तो राज्य के लिए एक अलग ड्राबल के साथ जाँच की जाती है, तो चेक की गई स्थिति UI में परिलक्षित होती है।

  7. हनीकॉम्ब के बाद किसी सूची आइटम के लिए एक अच्छी पृष्ठभूमि बनाने के लिए, आपके पास एक राज्य सूची है जो राज्य के लिए एक ड्रॉबल के साथ स्टेट करने योग्य है।

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

    <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 के साथ संयुक्त जाँच लागू करने का कोड हो सकता है:

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/

Stackoverflow: कस्टम बटन स्थिति कैसे जोड़ें

Stackoverflow: कस्टम जाँच योग्य दृश्य जो चयनकर्ता के प्रति प्रतिक्रिया करता है

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/


4
यह उत्तर अनमोल है। काश कि मैं इसे पढ़कर काम करने की कोशिश करूं, इससे पहले कि चेकेबल लेआउट को कैसे लागू किया जाए, आदि-आपको बहुत-बहुत धन्यवाद।
ब्लेक ममफोर्ड

12
महान जवाब, लेकिन "चयनित" आइटम को संबोधित नहीं करता है। मुझे वाक्यों में जवाब मिला कि आपने जो उद्धृत किया है, Selection is a transient property, representing the view (hierarchy) the user is currently interacting with. Activation is a longer-term state that the user can move views in and out of. For example, in a list view with single or multiple selection enabled, the views in the current selection set are activated. (Um, yeah, we are deeply sorry about the terminology here.)
उससे

मेरे कस्टम बैकग्राउंड का रंग केवल चयनित / केंद्रित वस्तुओं के पीछे दिखाई देता है, चेक किए गए आइटम नहीं, जब आपके द्वारा पोस्ट किए गए setItemChecked()android:state_activated="true"
हनीकोम्ब

1
बहुत बहुत धन्यवाद, मैंने 3 दिन बर्बाद कर दिए, यह जानने की कोशिश की जब तक मैंने खुद से यह पूछने का फैसला नहीं किया कि "चेक, चयनित और सक्रिय के बीच क्या अंतर है", बेकार है कि एक मेनू के रूप में कुछ सरल के साथ काम करना इतना जटिल, अतिरेक है Google की प्रतिभाओं द्वारा, इस कंपनी द्वारा दूसरों को धीमा करने के उद्देश्य से लगभग एक बाधा सेट की तरह लगता है।
गोबट्रॉन

20

डॉक्टर के अनुसार :

  • Android: state_selected बूलियन । " true" यदि इस मद का उपयोग तब किया जाना चाहिए जब वस्तु एक दिशात्मक नियंत्रण के साथ नेविगेट करते समय वर्तमान उपयोगकर्ता का चयन हो (जैसे जब डी-पैड के साथ सूची के माध्यम से नेविगेट करना); " false" यदि इस वस्तु का उपयोग किया जाना चाहिए जब वस्तु का चयन नहीं किया जाता है। फ़ोकस करते समय चयनित स्थिति का उपयोग किया जाता है (android: state_focused) पर्याप्त नहीं है (जैसे कि जब सूची दृश्य में फ़ोकस होता है और उसके भीतर एक आइटम डी-पैड के साथ चुना जाता है)।

  • Android: state_checked बूलियन । " true" यदि वस्तु की जाँच होने पर इस आइटम का उपयोग किया जाना चाहिए; " false" यदि इसका उपयोग तब किया जाना चाहिए जब वस्तु की जाँच नहीं की जाती है।

  • Android: state_activated बूलियन । " true" यदि इस आइटम का उपयोग तब किया जाना चाहिए जब ऑब्जेक्ट लगातार चयन के रूप में सक्रिय हो (जैसे कि स्थायी नेविगेशन दृश्य में पहले से चयनित सूची आइटम को "हाइलाइट" करना); " false" यदि इसका उपयोग तब किया जाना चाहिए जब ऑब्जेक्ट सक्रिय न हो। एपीआई स्तर 11 में पेश किया गया ।

मुझे लगता है कि डॉक बहुत स्पष्ट है, तो समस्या क्या है?


5
क्या आप Android पर विस्तार से बता सकते हैं: state_selected जब यह सच हो जाता है तो क्या हालात होते हैं?
एंडरसन

@ एंडरसन यह आपके द्वारा उपयोग किए जा रहे ViewGroup पर निर्भर करेगा - ListView, RecyclerView (शायद इसके LayoutManagers), GridView में अलग-अलग कार्यान्वयन हो सकते हैं: ListView कॉल सेट किए गए जहां GridView कॉल उदाहरण के लिए सेट किए गए हैं। यह सिर्फ विभिन्न प्लेटफ़ॉर्म संस्करणों पर आपके ऐप की जांच करने का मामला हो सकता है।
ataulm

1
@Anderson: यदि आपके पास एक सूची है, और उपयोगकर्ता के पास तीर कुंजियाँ हैं, तो एक "चयनित" है, और जब वे ऊपर / नीचे तीर करते हैं, तो चयन ऊपर / नीचे चलता है। जब वे "सक्रिय" कुंजी दबाते हैं, तो यह नियंत्रण को "सक्रिय" कर देता है, इसे माउस के रूप में अस्पष्ट रूप से चयन करें, और क्लिक करने के लिए अस्पष्ट रूप से सक्रिय / सक्रिय करें।
मूविंग डक

मैं सोच रहा था, मैं एक सूची दृश्य में एक आइटम को हाइलाइट करने के लिए सक्रिय का उपयोग करने जा रहा हूं, लेकिन क्या यह अन्य सूची आइटम के लिए सक्रिय को गलत पर सेट करता है ... यदि इनमें से कोई भी ऐसा नहीं करता है तो मुझे ढूंढने की आवश्यकता नहीं है अन्य सक्रिय चाइल्ड आइटम और सेट सक्रियण झूठे?
सिंह 89

0

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

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

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;
    }
    }
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.