Horizo​​ntalScrollView 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"/>