在我的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:无法在父级或祖先语句中找到方法seasonItemClicked(View)for android:在视图类android.support.v7.widget.AppCompatImageView上定义的onClick属性,其id为'season_image'
取消注释此行//seasonImage.setId(i);
会给我错误
android.content.res.Resources $ NotFoundException:无法找到资源ID#0x0`
图片被正确添加到布局中,就像我想要的那样。但我无法实现使它们可点击。我发现seasonImage.setId(i)
在我的案例中很重要,因为我需要点击的图片数量才能进行进一步的操作。
你能帮我解决一下这个问题吗?
答案 0 :(得分:1)
您正在分配已分配给其他资源的冲突ID,ID。为编程创建的视图生成ID的最佳方法是使用View.generateViewId或将其保留在res/values/ids.xml
文件中。
答案 1 :(得分:1)
问题是android:onClick
调用您的方法seasonItemClicked()
。您使用此属性的视图数量很多,他们都会调用相同的方法,但标识为android:id="@+id/season_image"
setId
方法可能非常烦人,因为您必须设置唯一 ID。有some method to generate it,因此,对于每张图片,您必须生成一个唯一的ID,如果您动态设置它,请不要用xml设置它。
但是,假设您的图像数量可以变化,我更喜欢在for循环中以编程方式添加单击侦听器。这样,它们将与点击的imageview相关。如下:
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"/>