我该如何开始一个Intent从OnClickListener [英] How do I start an Intent from an OnClickListener

查看:161
本文介绍了我该如何开始一个Intent从OnClickListener的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的主要活动扩展了ListActivity并显示一个列表。我正在使用一个名为DefinitionAdapter类中定义的自定义ListItems的。 我也有一个实现OnClickListener一个单独的类。

在类DefinitionAdapter我设置OnClickListener到ListItems的:

 公开查看getView(INT位置,查看convertView,ViewGroup中父){
        视图V = convertView;
        如果(V == NULL){
            LayoutInflater VI =(LayoutInflater)的getContext()。getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            V = vi.inflate(R.layout.row,NULL);
        }
...

        v.setOnClickListener(新OnItemClickListener(位置));

        返回伏;
   }
 

我的自定义OnClickListener应该开始另一项活动。

 公共类OnItemClickListener实现OnClickListener延伸活动{


    私人诠释的位置;

    公共OnItemClickListener(INT P){

        位置= P;
    }

    @覆盖
    公共无效的onClick(视图v){

        意向意图=新的意图(这一点,ShowDefinition.class);
        startActivity(意向);

    }

}
 

我不知道,我这样做的权利。我加了我新的活动清单,以及活动我扩展了监听器:

 <活动机器人:名称=ShowDefinition机器人:标签=@字符串/ APP_NAME>
< /活性GT;
<活动机器人:名称=OnItemClickListener机器人:标签=@字符串/ APP_NAME>
< /活性GT;
 

不过,如果我在列表中单击某个项目时,应用程序始终打破了一个NullPointerException异常。我想,我现在用的意图错误...任何想法?

在关于尼基塔Beloglazov的评论:

它打破了,当我创建的意图:

 意向意图=新的意图(这一点,ShowDefinition.class);
 

下面的堆栈跟踪:

  05-23 22:56:46.629:ERROR / AndroidRuntime(258):未捕获的处理程序:螺纹主力退出,由于未捕获的异常
05-23 22:56:46.659:ERROR / AndroidRuntime(258):显示java.lang.NullPointerException
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.content.ComponentName< INIT>(ComponentName.java:75)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.content.Intent< INIT>(Intent.java:2551)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在com.andiandy.juradefinitions.OnItemClickListener.onClick(OnItemClickListener.java:22)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.View.performClick(View.java:2364)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.View.onTouchEvent(View.java:4179)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.View.dispatchTouchEvent(View.java:3709)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.app.Activity.dispatchTouchEvent(Activity.java:2061)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.os.Handler.dispatchMessage(Handler.java:99)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.os.Looper.loop(Looper.java:123)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在android.app.ActivityThread.main(ActivityThread.java:4363)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在java.lang.reflect.Method.invokeNative(本机方法)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在java.lang.reflect.Method.invoke(Method.java:521)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-23 22:56:46.659:ERROR / AndroidRuntime(258):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

您OnItemClickListener不应延伸活动。相反,你应该安排OnItemClickListener能够访问你的ListActivity实例。任何认为已经是活动(如在ListView)的一部分,必须通过进入ListActivity实例的getContext()。然后执行的onClick 是这样的:

  @覆盖
公共无效的onClick(视图v){
    意向意图=新的意图(背景下,ShowDefinition.class);
    context.startActivity(意向);
}
 

My Main Activity extends ListActivity and displays a List. I am using custom Listitems defined in a class named DefinitionAdapter. I also have a seperate class that implements OnClickListener.

In the class DefinitionAdapter I set the OnClickListener to the 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;
   }

My custom OnClickListener is supposed to start another activity.

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);

    }

}

I am not sure that I am doing that right. I added my new activity to the manifest, as well as the activity i extended the listener with:

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

Nonetheless, if I click on an Item in my List, the application always breaks with a NullPointerException. I think I am using the intent wrong... any Ideas?

In regard to Nikita Beloglazov's comment:

It breaks when I create the Intent:

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

Here's the stacktrace:

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)

解决方案

Your OnItemClickListener should not extend Activity. Instead, you should arrange for the OnItemClickListener to have access to your ListActivity instance. Any view that is already part of the activity (like the ListView) has access to the ListActivity instance via getContext(). Then implement onClick like this:

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

这篇关于我该如何开始一个Intent从OnClickListener的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆