मैं जानना चाहता हूं कि उन राज्यों में क्या अंतर है। मुझे यह स्पष्ट करते हुए कोई वेबपेज नहीं मिला।
मैं जानना चाहता हूं कि उन राज्यों में क्या अंतर है। मुझे यह स्पष्ट करते हुए कोई वेबपेज नहीं मिला।
जवाबों:
चेक्ड और एक्टिवेटेड के बीच का अंतर वास्तव में काफी दिलचस्प है। यहां तक कि Google दस्तावेज़ भी क्षमाप्रार्थी है (नीचे जोड़ा गया जोर):
... उदाहरण के लिए, एकल या एकाधिक चयन सक्षम के साथ एक सूची दृश्य में, वर्तमान चयन सेट में विचार सक्रिय हैं। (उम, हाँ, हमें यहां शब्दावली के बारे में गहरा खेद है।) सक्रिय अवस्था को उस दृश्य के बच्चों के लिए प्रचारित किया जाता है, जिस पर इसे सेट किया गया है।
तो यहाँ अंतर है:
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 () कहा जा सकता है।
हनीकॉम्ब से पहले हमें अपनी सूची आइटम में स्टेट_चेक करने को दर्शाने के लिए वर्कआर्ड को लागू करना था। ऐसा इसलिए है क्योंकि ListView कॉल सेट की गई () केवल लेआउट में सबसे ऊपरी दृश्य पर है (और लेआउट चेक करने योग्य नहीं हैं) ... और यह मदद के बिना प्रचार नहीं करता है। ये वर्कअराउंड निम्न रूप में थे: चेकेबल को लागू करने के लिए रूट लेआउट का विस्तार करें। इसके निर्माता में, पुनरावर्ती सभी बच्चों को खोजते हैं जो चेकेबल को लागू करते हैं। जब सेटचेक () आदि ... कहते हैं, तो उन दृश्यों पर कॉल पास करें। यदि वे दृश्य राज्य सूची ड्राबल्स (उदाहरण के लिए एक चेकबॉक्स) को लागू करते हैं, तो राज्य के लिए एक अलग ड्राबल के साथ जाँच की जाती है, तो चेक की गई स्थिति UI में परिलक्षित होती है।
हनीकॉम्ब के बाद किसी सूची आइटम के लिए एक अच्छी पृष्ठभूमि बनाने के लिए, आपके पास एक राज्य सूची है जो राज्य के लिए एक ड्रॉबल के साथ स्टेट करने योग्य है।
<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"/>
हनीकोम्ब से पहले किसी सूची आइटम के लिए एक अच्छा बैकग्राउंड करने के लिए आप स्टेट_किटेड के लिए ऊपर की तरह कुछ करेंगे और आपको चेक करने योग्य इंटरफ़ेस को लागू करने के लिए अपने सबसे ऊपरी दृश्य का विस्तार करने की आवश्यकता है। उसके बाद आपको 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/
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"
डॉक्टर के अनुसार :
Android: state_selected बूलियन । " true
" यदि इस मद का उपयोग तब किया जाना चाहिए जब वस्तु एक दिशात्मक नियंत्रण के साथ नेविगेट करते समय वर्तमान उपयोगकर्ता का चयन हो (जैसे जब डी-पैड के साथ सूची के माध्यम से नेविगेट करना); " false
" यदि इस वस्तु का उपयोग किया जाना चाहिए जब वस्तु का चयन नहीं किया जाता है। फ़ोकस करते समय चयनित स्थिति का उपयोग किया जाता है (android: state_focused) पर्याप्त नहीं है (जैसे कि जब सूची दृश्य में फ़ोकस होता है और उसके भीतर एक आइटम डी-पैड के साथ चुना जाता है)।
Android: state_checked बूलियन । " true
" यदि वस्तु की जाँच होने पर इस आइटम का उपयोग किया जाना चाहिए; " false
" यदि इसका उपयोग तब किया जाना चाहिए जब वस्तु की जाँच नहीं की जाती है।
Android: state_activated बूलियन । " true
" यदि इस आइटम का उपयोग तब किया जाना चाहिए जब ऑब्जेक्ट लगातार चयन के रूप में सक्रिय हो (जैसे कि स्थायी नेविगेशन दृश्य में पहले से चयनित सूची आइटम को "हाइलाइट" करना); " false
" यदि इसका उपयोग तब किया जाना चाहिए जब ऑब्जेक्ट सक्रिय न हो। एपीआई स्तर 11 में पेश किया गया ।
मुझे लगता है कि डॉक बहुत स्पष्ट है, तो समस्या क्या है?
इस समस्या का अन्य समाधान यहां दिया गया है: 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;
}
}
});