【问题标题】:Error:android.view.View$OnClickListener on a null object reference错误:空对象引用上的 android.view.View$OnClickListener
【发布时间】:2016-11-19 19:34:50
【问题描述】:

当我尝试将 clickListener 设置为 ImageView 时,我收到了 NullPointerException。

java.lang.RuntimeException: Unable to start activity ComponentInfo{}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376)
  at android.app.ActivityThread.access$800(ActivityThread.java:147)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:135)
  at android.app.ActivityThread.main(ActivityThread.java:5253)
  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:899)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

activity_list_funny.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent" android:padding="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<TextView
    android:id="@+id/id1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="2dip"
    android:paddingTop="4dip"
    android:textStyle="bold"
    android:textIsSelectable="true"
    android:textSize="15sp"
    android:textColor="@android:color/holo_purple"/>
<TextView
    android:id="@+id/name1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="1dip"
    android:textStyle="bold"
    android:textIsSelectable="true"
    android:textSize="20sp"
    />
<ImageView
    android:id="@+id/imgbtn_favorite1"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_gravity="end"
    android:layout_alignBottom="@id/name1"
    android:src="@drawable/ic_favorite_border_black_24dp"
    android:contentDescription="@string/add_favr" />

</LinearLayout>

当我通过在我的 MainActivity 中创建一个对象并为其提供一个 OnClickListener 来启动 ImageView 时 当我运行它时,它会强制关闭并显示空对象引用

MainActivity.java

ArrayList<HashMap<String, String>> quotes;
ArrayAdapter adapter;
TextView t1,t2;
ListView list;
ImageView i;      
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_funny_quotes);
    cd = new ConnectionDetector(getApplicationContext());
    isInternetPresent = cd.isConnectingToInternet();
    c = (CoordinatorLayout) findViewById(R.id.coordinatorLayout1);

    **i=(ImageView)findViewById(R.id.imgbtn_favorite1);**

    adapter = new ArrayAdapter<>(this, R.layout.activity_list_funny);
    i.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

}

【问题讨论】:

  • 分享你的活动代码(你处理imgbtn_favorite1 ImageView的地方)
  • 请附上相关 Java代码。请不要再这样写了。
  • @GuilhermeP 已更新。
  • 您正在做的事情是导致视图无法加载到活动onStart():at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316)。我的猜测是不是专门针对i ImageView。

标签: android android-layout listview arraylist listadapter


【解决方案1】:

在调用方法之前检查i

if (i != null) {
    i.setOnClickListener(...);
}
else {
    Log.d(TAG, "Couldn't find ImageView");
}

【讨论】:

  • 只有当我在我的 MainActivity 中设置 OnClickListener 时才会加载图像,否则它会强制停止
【解决方案2】:

问题是:

您的活动正在使用以下布局:R.layout.activity_funny_quotes

但是你的按钮在里面:R.layout.activity_list_funny

这样,findViewById 返回 nulli == null

什么时候不为空

i=(ImageView)findViewById(R.id.imgbtn_favorite1); 仅在将适配器设置为 ListView (list.setAdapter(adapter)) 后才会返回有效的 ImageView。这样,ImageView 将被添加到屏幕上,findViewById(R.id.imgbtn_favorite1) 可能会返回一个有效的ImageView

即便如此,您的列表也不能为空。如果列表为空,屏幕将不会返回任何ImageView,您将继续收到null

还有一个问题:如果您的列表有多个项目,findViewById(R.id.imgbtn_favorite1) 将只返回第一个项目的ImageView

如何修复

很难告诉您如何正确解决您的问题。

您正在尝试将clickListener 添加到ImageView,该ImageView 将显示在您的ListView 中。

也许,最好定义一个ListView.setOnItemClickListener(),而不是在您的ImageView 中添加一个clickListener

【讨论】:

  • 嘿,谢谢,现在它正在加载,但是当我点击 Src 时什么都没有发生
  • 观看我的评论@GuilhermeP
【解决方案3】:
ListAdapter adapter = new SimpleAdapter(
                FunnyQuotes.this, quotes, R.layout.activity_list_funny,
                new String[]{TAG_ID,TAG_NAME,},
                new int[]{R.id.id1, R.id.name1}


        );

        list.setAdapter(adapter);
        i.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                i.setImageResource(R.drawable.ic_favorite_black_24dp);
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }

看到这个@GuilhermeP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多