2009-01-11 8 views
39

आप एक लंबे समय तक ट्रिगर किए गए संदर्भ मेनू को कैसे कार्यान्वित करते हैं या लिस्ट इन लेआउट और सूची एडाप्टर का उपयोग कर सूची एक्टिविटी पर टैप करते हैं?Android पर ListActivity में संदर्भ मेनू को आप कैसे कार्यान्वित करते हैं?

+3

आपके संपादन ने पूरी तरह से प्रश्न को प्रभावी ढंग से बदल दिया है। शायद अलग सवाल पूछने के लिए बेहतर होगा। –

उत्तर

73

onCreate विधि कॉल registerForContextMenu इस तरह पर:

registerForContextMenu(getListView()); 

और फिर onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) पर मेनू पॉप्युलेट। menuInfo तर्क जानकारी के बारे में जो आइटम को इस तरह से लंबे समय से क्लिक किया गया था प्रदान कर सकते हैं:

AdapterView.AdapterContextMenuInfo info; 
try { 
    info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
} catch (ClassCastException e) { 
    Log.e(TAG, "bad menuInfo", e); 
    return; 
} 
long id = getListAdapter().getItemId(info.position); 

और आप हमेशा की तरह बुला menu.add में मेनू आइटम जोड़ें:

menu.add(0, MENU_ITEM_ID, 0, R.string.menu_string); 

और उपयोगकर्ता एक विकल्प चुनता है जब , onContextItemSelected कहा जाता है। onMenuItemSelected और यह तथ्य स्पष्ट रूप से दस्तावेज में स्पष्ट रूप से समझाया नहीं गया है कि यह कहने के अलावा कि आप संदर्भ मेनू से कॉल प्राप्त करने के लिए अन्य विधि का उपयोग करते हैं; बस जागरूक रहें, आईडी साझा न करें।

onContextItemSelected आप MenuInfo के ahold प्राप्त कर सकते हैं और इस तरह आइटम की आईडी getMenuInfo() फोन करके चयनित पर:

try { 
    info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
} catch (ClassCastException e) { 
    Log.e(TAG, "bad menuInfo", e); 
    return false; 
} 
long id = getListAdapter().getItemId(info.position); 
+1

आह, धन्यवाद। पूरे वेब पर इसकी तलाश कर रहे थे लेकिन केवल पुराना संस्करण ही मिल सकता था। यह कपकेक के साथ सही काम करता है। –

+2

मुझे पता है कि क्लासकास्ट अपवाद गार्ड कोड Google नमूना में दिखाई देता है, लेकिन मुझे लगता है कि यह शायद अनावश्यक है। यह संभावना नहीं है कि MenuInfo केवल कभी-कभी एडाप्टर कॉन्टेक्स्टमेनूइन्फो है - यह शायद हमेशा या कभी नहीं होगा। गार्ड क्लॉज ऐप को क्रैश होने से रोकता है, लेकिन आपके पास एक तर्कसंगत बग है। मैं व्यक्तिगत रूप से पूरे स्टैक ट्रेस को देखता हूं, लेकिन यह सिर्फ मेरी वरीयता है। –

+1

@ डैनियल यंकोस्की: यदि आप केवल 'रजिस्टरफॉर कॉन्टेक्स्टमेनू' का उपयोग केवल एक बार करते हैं: हाँ। लेकिन कस्टम सूची गतिविधि लेआउट के साथ आपके पास पंजीकरण करने के लिए अन्य तत्व भी हो सकते हैं। लेकिन फिर: क्या 'exampleof' का उपयोग करना बेहतर नहीं होगा और आपको क्या मिला है इसकी जांच करें? - आह, ठीक है, मैंने कभी भी अच्छा डेमो कोड नहीं देखा। – Martin

5
listView = (ListView) findViewById(R.id.listpockets); 
registerForContextMenu(listView); 



public void onCreateContextMenu(android.view.ContextMenu menu, View v, android.view.ContextMenu.ContextMenuInfo menuInfo) { 
    //AdapterContextMenuInfo info = (AdapterContextMenuInfo)menuInfo; 
    menu.setHeaderTitle(getString(R.string.titleDelete)); 
    menu.add(0, CommonUtil.CONTEXT_MENU__DELETE_ID, 0, getString(R.string.menuDelete)); 
}; 
@Override 
public boolean onContextItemSelected(MenuItem item) { 

    if(item.getItemId() == CommonUtil.CONTEXT_MENU__DELETE_ID) 
    { 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     long id = this.listView.getItemIdAtPosition(info.position); 
     Log.d(TAG, "Item ID at POSITION:"+id); 
    } 
    else 
    { 
     return false; 
    } 
    return true; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे