【问题标题】:Cardslib's CardView OnCardClickListener's onClick method not being calledCardslib 的 CardView OnCardClickListener 的 onClick 方法未被调用
【发布时间】:2015-04-28 17:28:30
【问题描述】:

我在我的应用程序中使用这个库:Card Library : Guide 并创建了一张卡片,如示例所示。 现在我需要处理一个单击事件,但在实例化以下内容时收到错误消息: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 方法。怎么会?

【问题讨论】:

    标签: android android-layout android-recyclerview android-cardview cardslib


    【解决方案1】:

    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?

    编辑

    此外,从卡片包含的RelativeLayout 中删除android:clickable="true"。它正在为自己窃取点击。

    【讨论】:

    • 我按照你说的试过了,但又出现了一个错误。查看我的编辑
    • 对不起,把cardView.setOnClickListener改成card.setOnClickListener
    【解决方案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">
    

    然后卡片会被点击,但如果尝试对其进行个性化设置,例如添加相对布局,如下所示:

    <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 覆盖了整张卡片,当我找到它不在的地方时,它会检测到我的手指。如果我只添加一张空卡就可以了,但是我应该如何自定义它呢?

    这就像两个视图相互叠加

    【讨论】:

    • 从 RelativeLayout 中移除 android:clickable="true"。它正在为自己窃取点击。
    • 您的最后一条评论有效!你应该考虑编辑你的最后一个答案,所以我会接受它;)
    【解决方案3】:

    您必须在card(模型)而不是CardView(视图)上定义clickListener

    //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);
    

    【讨论】:

    • 好的,现在没有错误,但该方法仍然没有执行任何操作。请参阅我的 EDIT1。 ——
    • 好的,我已经运行了调试,但没有,onClick 似乎从未被调用过...... - 基本上,当我按下卡时似乎什么也没发生......为什么?我需要发布其他详细信息吗?
    • 我还更改了getBaseContext() 方法并改用Card card = new Card(this);,如EDIT1 中所示。但仍然无法调用 onClick 方法。
    • 为了解决这个问题,我尝试了一种解决方法,创建一个引用 xml 文件中 cardview 内的 RelativeLayout 视图的 RelativeLayout 对象,并在 RelativeLayout 对象上设置 onCardClickListener:它是这样工作的,但我不认为这是应该使用 `cardslib` 的方式!
    • @CrisBenois 当然,您可以在没有此解决方法的情况下使用库。我不知道你的问题是什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2016-07-28
    • 2014-03-04
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多