错误:null对象引用上的android.view.View $ OnClickListener

时间:2016-07-16 21:05:39

标签: android android-layout listview arraylist listadapter

当我尝试将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时 当我RuN It它强制关闭并显示空对象引用

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

        }
    });

}

3 个答案:

答案 0 :(得分:3)

问题是:

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

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

这样,findViewById会返回nulli == null

什么时候不会为空

只有在将适配器设置为ListView(i=(ImageView)findViewById(R.id.imgbtn_favorite1);)后,

ImageView才会返回有效的list.setAdapter(adapter)。这样,ImageView将添加到屏幕,findViewById(R.id.imgbtn_favorite1)可能会返回有效的ImageView

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

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

如何修复

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

您正尝试将clickListener添加到ImageViewListView

也许,最好定义ListView.setOnItemClickListener()而不是clickListener添加ImageView

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在调用方法之前检查i

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