如何从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>    
但是,如果我单击列表中的项目,则应用程序始终会由于NullPointerException而中断。我想我用错了意图...任何想法? 关于尼基塔·贝洛格拉佐夫的评论: 创建Intent时会中断:
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)
    

解决方法

您的OnItemClickListener不应扩展Activity。相反,您应该安排OnItemClickListener有权访问ListActivity实例。任何已经包含在活动中的视图(例如ListView)都可以通过
getContext()
访问ListActivity实例。然后像这样实现
onClick
@Override
public void onClick(View v) {
    Intent intent = new Intent(context,ShowDefinition.class);
    context.startActivity(intent);
}
    ,有两种方法可以实现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);
        }    
    }
}
这应该为点击做。如果您需要知道何时选择一个项目,可以查看AdapterView.OnItemSelectedListener -I_Artist     ,您的概念是错误的,您的OnItemClickListener不应扩展Activity,也不应每次都构建一个新的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

   }
}