2011-05-23 71 views
15

我的主要活動擴展了ListActivity並顯示一個List。我正在使用名爲DefinitionAdapter的類中定義的自定義Listitems。 我也有一個實現OnClickListener的獨立類。如何從OnClickListener啓動意圖

在課堂上DefinitionAdapter我設置OnClickListener到時listItems:

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

此時如果有什麼換行符確切知道嗎?你可以發佈堆棧跟蹤嗎? – 2011-05-23 23:03:32

+0

我補充說,信息 – twittfort 2011-05-23 23:09:27

回答

21

你OnItemClickListener不應擴大活動

當我創建的意圖它打破。相反,您應該安排OnItemClickListener訪問您的ListActivity實例。任何已經是活動一部分的視圖(如ListView)都可以通過getContext()訪問ListActivity實例。然後實現onClick這樣的:

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

這實際上是訣竅。我已經嘗試過: 'Intent intent = new Intent(v.getContext(),ShowDefinition。類);' 但是,然後我用startActivit(intent)啓動intent。現在我使用'v.getContext()。startActivity(intent)'來實現這個技巧。謝謝! – twittfort 2011-05-23 23:20:44

+0

很高興工作。實際上,更好的方法是重寫ListActivity子類中的「onListItemClicked」。那麼你不需要任何點擊監聽器。 (P.S.如果您還沒有完成,請不要忘記從清單中的活動列表中刪除OnItemClickListener。) – 2011-05-23 23:28:02

+0

我剛剛按照I_Artist的說明操作。這真的好多了。我想我只是沒有找到正確的ListActivity指令。應該更仔細地閱讀文檔。謝謝您的幫助。 – twittfort 2011-05-23 23:41:57

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 2011-05-23 23:22:47

3

有兩種實現onItemClickListener的方法。你不需要創建一個新的類。也許你可以試試最簡單的方式,現在:)

有你的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); 
     }  
    } 
} 

那s應該做點擊。如果需要,當一個項目被選中,你可以看看AdapterView.OnItemSelectedListener

-I_Artist

+0

謝謝。我會補充解決方案。我將盡力在將來以這種方式實施。爲了更容易理解這個概念,我做了額外的課程。 – twittfort 2011-05-23 23:25:35

+0

好的,現在我嘗試了你的解決方案。它真的更簡單! 我剛剛遇到了實現AdapterView.OnItemClickListener的麻煩。 Eclipse沒有找到它。我不得不實現android.widget.AdapterView.OnItemClickListener – twittfort 2011-05-23 23:40:54

+0

你非常歡迎。我剛剛編輯了我的回覆,以添加意圖的實際代碼。我希望它能像你想要的那樣運作! 隨時upvote我的答案,如果你認爲它幫助:) – MikeWallaceDev 2011-05-23 23:42:11