2016-12-24 4 views
1

В моем файле XML у меня есть макет для моего фрагмента, который содержит HorizontalScrollView так:метод HorizontalScrollView OnClick бросает ошибки

<HorizontalScrollView 
    android:id="@+id/srollview_seasons_gallery 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="left"> 
</HorizontalScrollView> 

В отдельном файле XML называется season_list_item я сделал схему, как отдельный элемент должен выглядеть следующим образом:

<?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) в родительском или предком контексте для андроида: OnClick атрибут, определенный на вид класса android.support.v7.widget.AppCompatImageView с идентификатором «» season_image

раскомментировать эту строку //seasonImage.setId(i); дает мне ошибку

android.content.res.Resources $ NotFoundException: Не удалось найти 0x0`

Изображения добавляются правильно макет, так же, как я хочу, чтобы ресурс ID #. Но я не могу добиться, чтобы сделать их кликабельными. Я также нахожу seasonImage.setId(i) важным в моем случае, так как мне нужен номер изображения, на который было нажато для дальнейших действий.

Не могли бы вы помочь мне, как к этому нужно подойти?

ответ

1

Проблема , которая вызывает ваш метод seasonItemClicked(). Поскольку у многих просмотров у вас есть этот атрибут, они все вызовут тот же метод, но с тем же ID android:id="@+id/season_image".
Метод setId может быть очень раздражающим, потому что вы должны установить уникальный id. Существует some method to generate it, поэтому для каждого изображения вам нужно создать уникальный идентификатор, и если вы установите его динамически, не устанавливайте его по xml.

Однако, предполагая, что количество ваших изображений может быть переменной, я бы предпочел программным образом добавить программу-клик в for-loop. Таким образом, они будут связаны с щелчком изображения. Как следует:

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"/> 
+0

работает отлично. Спасибо :) – dddeee

1

Вы назначаете конфликтующие идентификаторы, идентификаторы, которые уже назначены другим ресурсам. Лучший способ генерации идентификаторов для программно созданных представлений - использовать View.generateViewId или зарезервировать их в файле res/values/ids.xml.

Смежные вопросы