如何从OnClickListener启动一个Intent

我的主要活动扩展ListActivity并显示一个列表。 我正在使用名为DefinitionAdapter的类中定义的自定义Listitems。 我也有一个实现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> 

尽pipe如此,如果我点击我的列表中的项目,应用程序总是打破NullPointerException。 我想我正在使用意图错误…任何想法?

关于Nikita Beloglazov的评论:

当我创build意图时,它会中断:

 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) 

  • 有没有办法使用ArrayAdapter更新多个TextView?
  • Android系统。 将联系人显示为列表视图
  • 在没有自定义ListView的ListActivity中使用setDivider更改分隔符?
  • 点击不能在Listitem Listview android上工作
  • 如何使用TabLayout在Fragment中使用CardView行实现RecyclerView
  • Android如何知道哪个checkbox被选中
  • android中的嵌套的内部Activity类
  • 从对象的数组列表填充列表视图
  • 您的OnItemClickListener不应该扩展活动。 相反,您应该安排OnItemClickListener访问您的ListActivity实例。 任何已经是活动一部分的视图(如ListView)都可以通过getContext()访问ListActivity实例。 然后像这样实现onClick

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

    有两种方法来实现onItemClickListener。 你不需要创build一个新的类。 也许你可以尝试一下现在的简单方法:)

    让你的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

    你的概念是错误的,你的OnItemClickListener不应该扩展活动,你不应该build立一个新的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 } }