当我尝试将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) {
}
});
}
答案 0 :(得分:3)
问题是:
您的活动正在使用以下布局:R.layout.activity_funny_quotes
但你的按钮在里面:R.layout.activity_list_funny
这样,findViewById
会返回null
和i == 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
添加到ImageView
中ListView
。
也许,最好定义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");
}