【问题标题】:Debug tells me to switch setOnClickListener with setOnItemClickListener调试告诉我用 setOnItemClickListener 切换 setOnClickListener
【发布时间】:2015-07-12 02:24:18
【问题描述】:

调试时,控制台告诉我应该使用setOnItemClickListener 而不是setOnClickListener,因为我有一个AdapterView。当我按下一个按钮并且该按钮应该将我转换到另一个活动时会出现此错误。我尝试实现setOnItemClick 并导入android.widget.AdapterView.OnItemClickListener;,但我的代码下仍然出现红线。我做错了什么?

用于按钮操作的原始 Java 代码

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class NewLocation extends ActionBarActivity {

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_location);
        findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(NewLocation.this, RoomDescription.class));
            }
        });
    }

调试错误

07-11 11:37:45.281    2141-2141/com.customledsupply.ledaudit E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.customledsupply.ledaudit, PID: 2141
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.customledsupply.ledaudit/com.customledsupply.ledaudit.RoomDescription}: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
            at android.widget.AdapterView.setOnClickListener(AdapterView.java:783)
            at com.customledsupply.ledaudit.RoomDescription.onCreate(RoomDescription.java:17)
            at android.app.Activity.performCreate(Activity.java:5990)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

按钮活动的新 Java 代码

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;

public class NewLocation extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_location);
        findViewById(R.id.button4).setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(NewLocation.this, RoomDescription.class));
            }
        });
    }

【问题讨论】:

  • 错误提示您有一个ListViewGridView id button4
  • 该按钮已连接到具有ListView 的页面,可能是这样吗?
  • 不,主要是你错误地将相同的 id 分配给 listview 和 button
  • 尝试在活动上设置项目点击侦听器,因为它是操作栏活动,我猜按钮在栏内。
  • 这是我的导航编辑器的图片供参考drive.google.com/open?id=0B80RkK4mIcD4YjBYWlNSdTk0Qnc

标签: android android-studio


【解决方案1】:

AdapterView 上设置OnClickListener 没有意义,因为通常应该单击它的AdapterView 的子级(例如ListView 的行)。这就是为什么它告诉你改为设置OnItemClickListener

当您这样做时,您的匿名内部类需要更改,因为OnItemClickListener 没有签名为void onClick(View v) 的方法。你需要

findViewById(R.id.button4).setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // your code here
    }
});

【讨论】:

  • 谢谢!我没有意识到内部必须改变。
猜你喜欢
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
相关资源
最近更新 更多