Метод Cardslib CardView OnCardClickListener onClick не вызывается
Я использую эту библиотеку в своем приложении: Библиотека карт: Руководство и создал карту, как показано в примере. Теперь мне нужно обработать событие click, но я получаю сообщение об ошибке при создании следующего: new Card.OnCardClickListener
, который говорит OnCardClickListener is abstract: cannot be instantiated
, В моей деятельности у меня есть этот код:
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
В чем дело? Как я могу установить свою карту как активируемую, а затем обрабатывать события нажатия / касания?
РЕДАКТИРОВАТЬ
Если я использую это так:
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
на самой карте, и больше нет ошибок, но все равно она не выполняет никаких действий при нажатии на карту. Это новый код:
//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?
РЕДАКТИРОВАТЬ
Кроме того, удалить android:clickable="true"
из RelativeLayout, содержащегося в карте. Это крадет клик для себя.
Я нашел ошибку, но я не знаю, как с ней справиться. Это в макете, содержащем карту, 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 покрывает всю карту, и когда я нахожу место, где его нет, он обнаруживает мой палец. Это работает, если я только добавляю пустую карту, но как мне тогда ее настроить?
Это как два взгляда друг на друга
Вы должны определить 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);
Кстати, вы также должны использовать что-то подобное в Activity
:
Card card = new Card(this);