2

Я использую эту библиотеку в своем приложении: Card Library : Guide и создал карту, как показано в примере. Теперь мне нужно обработать событие click, но я получаю сообщение об ошибке при создании экземпляра: new Card.OnCardClickListener, в котором говорится, что OnCardClickListener is abstract: cannot be instantiated. В моей деятельности у меня есть этот код:Cardlib's CardView OnCardClickListener's onClick метод не называется

Card card = new Card(getBaseContext());//getContext() 
    CardHeader header = new CardHeader(getBaseContext()); 
    card.addCardHeader(header); 
    final CardViewNative cardView = (CardViewNative) findViewById(R.id.carddemo); 
    cardView.setCard(card); 

    cardView.setClickable(true); 
    cardView.setOnClickListener(new Card.OnCardClickListener()); //error here 

Что случилось? Как я могу настроить свою карту как интерактивную, а затем обрабатывать события click/touch?

EDIT

Если я использую это так:

cardView.setOnClickListener(new Card.OnCardClickListener(){//error here 
     @Override 
     public void onClick(Card card, View view) { 
      // This will execute when the the card is clicked 
     } 
    }); 

он говорит cannot resolve method setOnClickListener(it.gmariotti.cardslib.library.internal.Card.OnCardClickListener)

EDIT1

Вы, ребята правы, я поставил setOnClickListener на сама карта, и нет никакой ошибки anymor e, , но все же он не выполняет никаких действий при нажатии на карту. Вот новый код:

 //Create a Card 
    Card card = new Card(this);//getContext() 

    //Create a CardHeader 
    CardHeader header = new CardHeader(this); 
    //.... 
    //Add Header to card 
    card.addCardHeader(header); 

    //Set card in the cardView 
    CardViewNative cardView = (CardViewNative) this.findViewById(R.id.carddemo); 
    cardView.setCard(card); 

    card.setClickable(true); 
    card.setOnClickListener(new Card.OnCardClickListener(){ 
     @Override 
     public void onClick(Card card, View view) { 
      // This will execute when the the card is clicked 
      Toast.makeText(CardMariotti.this,"Clickable card", Toast.LENGTH_LONG).show(); 
     } 
    }); 

Я выполнил отладки, но метод onClick никогда не вызывается. Как так?

ответ

3

Card.OnCardClickListener - это интерфейс. Вы должны создать класс, который определяет, как использовать функции в интерфейсе. Попробуйте это:

card.setOnClickListener(new Card.OnCardClickListener() { 
    @Override 
    public void onClick(Card card, View view) { 
     // This will execute when the the card is clicked 
    } 
}); 

Источник для ответа: https://github.com/gabrielemariotti/cardslib/blob/master/doc/CARD.md#clickable-card

Информация на Java интерфейсы: Java Interfaces?

EDIT

Кроме того, удалить android:clickable="true" из RelativeLayout, содержащейся в карте. Это крадет клик для себя.

+0

Я пробовал, как вы сказали, и у меня есть еще одна ошибка. См. Мое редактирование –

+0

Извините, измените cardView.setOnClickListener на card.setOnClickListener – BVB

1

Вы должны определить clickListener на (модели) card вместо CardView (вид)

//Set onClick listener 
card.setOnClickListener(new Card.OnCardClickListener() { 
      @Override 
      public void onClick(Card card, View view) { 
       Toast.makeText(getActivity(),"Clickable card", Toast.LENGTH_LONG).show(); 
      } 
     }); 

В то же время вы должны использовать:

//it is not necessary if you define a ClickListener on the card 
    card.setClickable(true); 

Btw, вы должны также использовать что-то вроде этого в Activity:

Card card = new Card(this); 
+0

Я уже использую метод 'setClickable' –

+0

Хорошо, теперь нет ошибки, но все же метод не выполняет никаких действий. См. Мой EDIT1. - –

+1

Попробуйте отладить код. Вызывается onClick? –

2

Я нашел ошибку, но я не знаю, как ее обрабатывать. Это в макете, содержащей карту, cardslib_item_card.xml.Если удалить все, что я добавил, и я просто держать это:

<it.gmariotti.cardslib.library.view.CardViewNative  xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card="http://schemas.android.com/apk/res-auto" 
    card:card_layout_resourceID="@layout/native_card_layout" 
    style="@style/native_recyclerview_card.base" 
    card_view:cardCornerRadius="4dp" 
    android:id="@+id/carddemo" 
    android:layout_marginTop="12dp" 
    android:layout_width="match_parent" android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:layout_marginLeft="12dp" android:layout_marginRight="12dp"> 

то карта получает щелкнул, но если попытаться настроить его, например, добавив Relative Layout, как таковой:

<it.gmariotti.cardslib.library.view.CardViewNative  
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card="http://schemas.android.com/apk/res-auto" 
    card:card_layout_resourceID="@layout/native_card_layout" 
    style="@style/native_recyclerview_card.base" 
    card_view:cardCornerRadius="4dp" 
    android:id="@+id/carddemo" 
    android:layout_marginTop="12dp" 
    android:layout_width="match_parent" android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:layout_marginLeft="12dp" android:layout_marginRight="12dp"> 

    <RelativeLayout android:id="@+id/cardlayout" 
     android:layout_width="match_parent" android:layout_height="match_parent" 
     android:background="?android:selectableItemBackground"    
     android:clickable="true"> 
    <!-- layout containing 3 TextViews --> 
    </RelativeLayout> 
</it.gmariotti.cardslib.library.view.CardViewNative> 

, то карта больше не нажимается. Чтобы быть более точным, его иногда нажимают, как будто RelativeLayout покрывает всю карту, и когда я нахожу место, где это не так, он обнаруживает мой палец. Он работает, если я добавляю только пустую карту, но как же я должен ее настроить?

Это как иметь два вида друг на друга

+1

Удалить андроид: clickable = " true "из RelativeLayout. Это крадет клик для себя. – BVB

+0

Ваш последний комментарий работал! вы должны рассмотреть возможность редактирования своего последнего ответа, чтобы я его принял;) –