Horizo​​ntalScrollView OnClick方法抛出错误

时间:2016-12-24 00:28:18

标签: android horizontalscrollview

在我的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)在我的案例中很重要,因为我需要点击的图片数量才能进行进一步的操作。

你能帮我解决一下这个问题吗?

2 个答案:

答案 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"/>