HorizontalScrollView OnClick 方法抛出错误
HorizontalScrollView OnClick method throws errors
在我的 XML 文件中,我的片段布局包含 HorizontalScrollView
,如下所示:
<HorizontalScrollView
android:id="@+id/srollview_seasons_gallery
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="left">
</HorizontalScrollView>
在名为 season_list_item
的单独 XML 文件中,我制作了一个模式,说明单个项目应该是什么样子:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/season_image"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:onClick="seasonItemClicked"/>
</RelativeLayout>
我使用我的 java 代码动态添加项目,如下所示:
for (int i=0; i<seasonsSize; i++) {
View vi = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.season_list_item, null);
ImageView seasonImage = (ImageView) vi.findViewById(R.id.season_image);
//seasonImage.setId(i);
String imgUrl = response.body().getEmbedded().getSeasons().get(i).getImage().getMedium();
Picasso.with(getContext()).load(imgUrl).into(seasonImage);
seasonsLinearLayout.addView(vi);
}
seasonsScrollView.addView(seasonsLinearLayout);
当我执行 onClick 方法时:
public void seasonItemClicked(View view) {
}
我收到错误
java.lang.IllegalStateException: Could not find method seasonItemClicked(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatImageView with id 'season_image'
取消注释这一行 //seasonImage.setId(i);
给我错误
android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0`
图片已正确添加到布局中,就像我希望的那样。但是我无法使它们可点击。我还发现 seasonImage.setId(i)
对我来说很重要,因为我需要点击图片的编号以进行进一步操作。
你能帮我解决这个问题吗?
您分配的 ID 存在冲突,这些 ID 已分配给其他资源。为以编程方式创建的视图生成 ID 的最佳方法是使用 View.generateViewId 或将它们保留在 res/values/ids.xml
文件中。
问题是 android:onClick
调用了您的方法 seasonItemClicked()
。由于您拥有此属性的多个视图,它们都将调用相同的方法,但具有相同的 ID android:id="@+id/season_image"
.
setId
方法可能会很烦人,因为您必须设置一个 unique id。有some method to generate it,所以,对于每张图片,你必须生成一个唯一的ID,如果你动态设置它,不要设置xml。
但是,假设您的图像数量可以变化,我更愿意在 for 循环中以编程方式添加点击侦听器。这样,它们将与单击的图像视图相关。如下:
for (int i=0; i<seasonsSize; i++) {
...
ImageView seasonImage = (ImageView) vi.findViewById(R.id.season_image);
seasonImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// perform your actions, be aware that 'view' here, is the image clicked
}
}
...
seasonsLinearLayout.addView(vi);
}
并且只需删除 android:onclick
属性:
<ImageView
...
android:id="@+id/season_image"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"/>
在我的 XML 文件中,我的片段布局包含 HorizontalScrollView
,如下所示:
<HorizontalScrollView
android:id="@+id/srollview_seasons_gallery
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="left">
</HorizontalScrollView>
在名为 season_list_item
的单独 XML 文件中,我制作了一个模式,说明单个项目应该是什么样子:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/season_image"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:onClick="seasonItemClicked"/>
</RelativeLayout>
我使用我的 java 代码动态添加项目,如下所示:
for (int i=0; i<seasonsSize; i++) {
View vi = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.season_list_item, null);
ImageView seasonImage = (ImageView) vi.findViewById(R.id.season_image);
//seasonImage.setId(i);
String imgUrl = response.body().getEmbedded().getSeasons().get(i).getImage().getMedium();
Picasso.with(getContext()).load(imgUrl).into(seasonImage);
seasonsLinearLayout.addView(vi);
}
seasonsScrollView.addView(seasonsLinearLayout);
当我执行 onClick 方法时:
public void seasonItemClicked(View view) {
}
我收到错误
java.lang.IllegalStateException: Could not find method seasonItemClicked(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatImageView with id 'season_image'
取消注释这一行 //seasonImage.setId(i);
给我错误
android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0`
图片已正确添加到布局中,就像我希望的那样。但是我无法使它们可点击。我还发现 seasonImage.setId(i)
对我来说很重要,因为我需要点击图片的编号以进行进一步操作。
你能帮我解决这个问题吗?
您分配的 ID 存在冲突,这些 ID 已分配给其他资源。为以编程方式创建的视图生成 ID 的最佳方法是使用 View.generateViewId 或将它们保留在 res/values/ids.xml
文件中。
问题是 android:onClick
调用了您的方法 seasonItemClicked()
。由于您拥有此属性的多个视图,它们都将调用相同的方法,但具有相同的 ID android:id="@+id/season_image"
.
setId
方法可能会很烦人,因为您必须设置一个 unique id。有some method to generate it,所以,对于每张图片,你必须生成一个唯一的ID,如果你动态设置它,不要设置xml。
但是,假设您的图像数量可以变化,我更愿意在 for 循环中以编程方式添加点击侦听器。这样,它们将与单击的图像视图相关。如下:
for (int i=0; i<seasonsSize; i++) {
...
ImageView seasonImage = (ImageView) vi.findViewById(R.id.season_image);
seasonImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// perform your actions, be aware that 'view' here, is the image clicked
}
}
...
seasonsLinearLayout.addView(vi);
}
并且只需删除 android:onclick
属性:
<ImageView
...
android:id="@+id/season_image"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"/>