2011-05-23 12 views
15

से मेरा इरादा कैसे शुरू करूं मेरी मुख्य गतिविधि ListActivity बढ़ाती है और एक सूची प्रदर्शित करती है। मैं DefinitionAdapter नामक कक्षा में परिभाषित कस्टम लिस्टिटैम्स का उपयोग कर रहा हूं। मेरे पास एक अलग वर्ग भी है जो OnClickListener लागू करता है।मैं ऑनक्लिक लिस्टनर

वर्ग DefinitionAdapter में मैं ListItems को OnClickListener सेट:

public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getContext().getSystemService(
        Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.row, null); 
     } 
... 

     v.setOnClickListener(new OnItemClickListener(position)); 

     return v; 
    } 

मेरे कस्टम OnClickListener एक और गतिविधि शुरू करने के लिए माना जाता है।

public class OnItemClickListener implements OnClickListener extends Activity { 


    private int position; 

    public OnItemClickListener(int p) { 

     position = p; 
    } 

    @Override 
    public void onClick(View v) { 

     Intent intent = new Intent(this, ShowDefinition.class); 
     startActivity(intent); 

    } 

} 

मुझे यकीन नहीं है कि मैं यह सही कर रहा हूं।

<activity android:name="ShowDefinition" android:label="@string/app_name"> 
</activity> 
<activity android:name="OnItemClickListener" android:label="@string/app_name"> 
</activity>  

बहरहाल, अगर मैं अपने सूची में किसी आइटम पर क्लिक करें, आवेदन हमेशा एक NullPointerException साथ टूट जाता है: मैं प्रकट करने के लिए मेरी नई गतिविधि है, साथ ही गतिविधि मैं के साथ श्रोता बढ़ाया गयी। मुझे लगता है कि मैं इरादा गलत इस्तेमाल कर रहा हूं ... कोई विचार?

निकिता Beloglazov की टिप्पणी के संबंध में:

यह टूट जाता है जब मैं आशय बनाने के लिए:

Intent intent = new Intent(this, ShowDefinition.class); 

यहाँ स्टैकट्रेस है:

05-23 22:56:46.629: ERROR/AndroidRuntime(258): Uncaught handler: thread main exiting due to uncaught exception 
05-23 22:56:46.659: ERROR/AndroidRuntime(258): java.lang.NullPointerException 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.content.ComponentName.<init>(ComponentName.java:75) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.content.Intent.<init>(Intent.java:2551) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at com.andiandy.juradefinitions.OnItemClickListener.onClick(OnItemClickListener.java:22) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.View.performClick(View.java:2364) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.View.onTouchEvent(View.java:4179) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.View.dispatchTouchEvent(View.java:3709) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.os.Looper.loop(Looper.java:123) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
05-23 22:56:46.659: ERROR/AndroidRuntime(258):  at dalvik.system.NativeStart.main(Native Method) 
+0

पर गौर कर सकते की जरूरत है? क्या आप स्टैकट्रैक पोस्ट कर सकते हैं? –

+0

मैंने कहा कि जानकारी – twittfort

उत्तर

21

आपका OnItemClickListener गतिविधि का विस्तार नहीं होना चाहिए। इसके बजाए, आपको OnItemClickListener को अपनी ListActivity उदाहरण तक पहुंच प्राप्त करने की व्यवस्था करनी चाहिए। कोई भी दृश्य जो पहले से ही गतिविधि (जैसे सूची दृश्य) का हिस्सा है, को 0Aके माध्यम से ListActivity उदाहरण तक पहुंच है। तब onClick इस तरह लागू:

@Override 
public void onClick(View v) { 
    Intent intent = new Intent(context, ShowDefinition.class); 
    context.startActivity(intent); 
} 
+8

वास्तव में यह चाल है। मैंने पहले ही कोशिश की है: 'इरादा इरादा = नया इरादा (v.getContext(), शोडिफिनिशन।कक्षा); ' लेकिन फिर मैं startActivit (मंशा) के साथ इरादा शुरू करता हूं। अब मैं 'v.getContext()। StartActivity (इरादा) 'का उपयोग करता हूं जो चाल करता है। धन्यवाद! – twittfort

+0

खुशी है कि यह काम किया। वास्तव में, एक बेहतर तरीका है, वास्तव में, आपकी ListActivity subclass में 'onListItemClicked' को ओवरराइड करना है। तब आपको किसी भी क्लिक श्रोताओं की आवश्यकता नहीं है। (पीएस। यदि आपने अभी तक यह नहीं किया है, तो मैनिफेस्ट में गतिविधियों की सूची से OnItemClickListener को निकालना न भूलें।) –

+0

मैंने अभी ऐसा किया है, I_Artist के निर्देशों के बाद। यह वास्तव में बहुत बेहतर है। मुझे लगता है कि मुझे सही सूची एक्टिविटी निर्देश नहीं मिला। दस्तावेज़ीकरण को अधिक सावधानी से पढ़ना चाहिए था। सहायता के लिए धन्यवाद। – twittfort

0

आपका गर्भाधान गलत है, अपने OnItemClickListener गतिविधि फैली नहीं करना चाहिए और आप एक नया onClickListener हर बार का निर्माण नहीं करना चाहिए।

public class MainActivity extends Activity { 
    OnItemClickListener = null; 

    MainActivity() { 
    //Build your OnItemClickListener with a valid context 
    OnItemClickListener = new OnItemClickListener(this); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
    ... 

    //Here user the OnItemClickListener 

    } 
} 
+0

क्षमा करें, मुझे वह समाधान नहीं मिला:/लेकिन मैंने इसे पहले ही तय कर दिया है :) – twittfort

3

ऑनइटम क्लाइस्टनर को लागू करने के दो तरीके हैं। आपको एक नई कक्षा बनाने की जरूरत नहीं है। हो सकता है कि आप इसे अब :)

के लिए आसान तरीका कोशिश कर सकते हैं

अपने ListActivity AdapterView.OnItemClickListener

public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener 

तो लागू है अपने ListActivity के onCreate में सेट अपने onClickListener इस तरह:

 ListView lstvwContacts = getListView(); 
     lstvwContacts.setOnItemClickListener(this); 

और फिर आप इस तरह के क्लिक पर प्रतिक्रिया कर सकते हैं:

public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
    switch (parent.getId()) { 
     case android.R.id.list: { 
      Log.v(TAG, "onItemClick"); 
      Intent intent = new Intent(this, ShowDefinition.class); 
      startActivity(intent); 
     }  
    } 
} 

क्लिक के लिए यह कर सकते हैं। आप को पता है जब एक आइटम चयनित हो तो आप वास्तव में क्या लाइन है, तो टूट जाता है पर AdapterView.OnItemSelectedListener

-I_Artist

+0

धन्यवाद। मैं उस समाधान की प्रशंसा करूंगा। मैं इसे भविष्य में इस तरह लागू करने की कोशिश करूंगा। मैंने अवधारणा की आसान समझ के लिए अतिरिक्त कक्षा बनाई है। – twittfort

+0

ठीक है, अब मैंने आपके समाधान की कोशिश की है। यह वास्तव में बहुत आसान है! मुझे एडाप्टर व्यू.ऑनआईटैमक्लिक लिस्टनर को लागू करने में केवल परेशानी थी। ग्रहण इसे नहीं मिला। मुझे android.widget.AdapterView.OnItemClickListener – twittfort

+0

लागू करना था आपका स्वागत है। मैंने इरादे के लिए वास्तविक कोड जोड़ने के लिए अभी अपनी प्रतिक्रिया संपादित की है। मुझे उम्मीद है कि यह सब काम करता है जैसे आप चाहते हैं! यदि आपको लगता है कि यह मदद करता है तो मेरे उत्तर को ऊपर उठाने के लिए स्वतंत्र महसूस करें :) – MikeWallaceDev

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