1
votes

La méthode OnClick pour une vue personnalisée n'a jamais été appelée (Android)

J'essaie d'utiliser la vue personnalisée qui étend RelativeLayout et nommée CardView . A ajouté quelques attr et créé un fichier XML pour eux, tout fonctionne correctement, sauf onClick . Donc, au début, j'ai créé une classe spéciale pour ma vue:

class HomeViewModel : BaseViewModel<Router>() {

    fun onClick() {
        Log.e("myLog", "HomeViewModel onClick")
    }
}

J'ai également un fichier xml pour ma vue:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">

<data>

    <variable
        name="viewModel"
        type="com.presentation.screen.HomeViewModel" />
</data>

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<com.project.presentation.utils.CardView
        android:id="@+id/card"
        android:layout_width="@dimen/cardSize"
        android:layout_height="@dimen/cardSize"
        android:clickable="true"
        android:onClick="@{() -> viewModel.onClick()}"
        app:image="@drawable/icon"
        app:lineColor="@color/colorPrimary"
        app:text="@string/text" />    

</android.support.constraint.ConstraintLayout>
</layout>

Et enfin, j'ai ajouté mon customView dans la mise en page de l'activité avec un lien vers la méthode onClick dans le modèle de vue comme ici:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/cardSize"
android:layout_height="@dimen/cardSize"
android:background="@drawable/card_color_selector"
android:clickable="true">

<ImageView
    android:id="@+id/image"
    android:layout_width="60sp"
    android:layout_height="60sp"
    android:layout_centerHorizontal="true"
    android:layout_margin="3sp"
    tools:src="@color/colorPrimary" />

<TextView
    android:id="@+id/caption"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="@style/text_normal"
    android:textSize="15dp"
    android:layout_alignParentBottom="true"
    android:layout_margin="10sp"
    android:gravity="center"
    android:textColor="@color/darkGray"
    tools:text="Caption" />

<ImageView
    android:id="@+id/line"
    android:layout_width="match_parent"
    android:visibility="visible"
    android:layout_height="5dp"
    android:layout_alignParentBottom="true"
    android:background="@color/colorPrimary" />

</RelativeLayout>

Donc tout va bien, les couleurs sont changées comme je l'avais écrit dans card_color_selector.xml , mais la méthode onClick dans mon ViewModel n'a jamais appelé . Oh, au fait que mon modèle de vue est ici, maintenant je veux juste enregistrer tous les clics:

class CardView(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs) {

init {
    inflate(context, R.layout.card_view, this)
    val imageView: ImageView = findViewById(R.id.image)
    val textView: TextView = findViewById(R.id.caption)
    val line: ImageView = findViewById(R.id.line)

    val attributes = context.obtainStyledAttributes(attrs, R.styleable.CardView)
    imageView.setImageResource(attributes.getResourceId(R.styleable.CardView_image, 0))
    textView.text = attributes.getString(R.styleable.CardView_text)
    line.setBackgroundColor(attributes.getColor(R.styleable.CardView_lineColor, 0))
    attributes.recycle()
} }

J'ai tout essayé! S'il vous plaît, aidez-moi à comprendre ce que je fais de mal.


0 commentaires

4 Réponses :


0
votes

Dans votre section

fun onClick() {
    Log.e("myLog", "HomeViewModel onClick")
} 

passer View In XML pour

onClick = "method", vous devez définir le paramètre comme classe View dans votre méthode.

Vous pouvez voir ceci


0 commentaires

0
votes

Changez votre méthode onClick comme ceciEssayez comme ceci

fun onClick(view: View) {
        Log.d("myLog", "HomeViewModel onClick")
    }


4 commentaires

Malheureusement, j'ai déjà essayé de cette façon, cela ne change rien :(


Si cela ne vous dérange pas, puis-je vous demander une chose pourquoi vous utilisez Log.e au lieu de Log.d ou autres ?? Avez-vous correctement vérifié le journal?


oui, car il y a un autre journal dans mon application, donc je n'ai aucun problème avec eux.


il semble que je doive définir onClickListener sur ma vue personnalisée, mais dans l'architecture mvvm, je ne peux rien utiliser comme findViewById . C'est pourquoi j'essaie de trouver une autre solution.



0
votes

Je n'ai pas assez de réputation pour commenter, alors pouvez-vous essayer

     fun onClick(view:View) {
    Log.e("myLog", "HomeViewModel onClick")
     }

et pour la fonction

    android:onClick="@{(v) -> viewModel.onClick(v)}"


2 commentaires

Oui, j'ai déjà essayé et je ne sais pas pourquoi cela ne fonctionne pas. Le problème pourrait-il être lié à l'attribut android: clickable = "true" pour la mise en page dans ma vue personnalisée?


Peut-être que le seul moyen de le savoir est de le tester. supprimez les deux attributs vrai cliquables et testez-les. et assurez-vous que vous avez défini la valeur de homeViewModel.



1
votes

J'ai eu le même problème.

Vérifiez l'attribut cliquable de votre vue personnalisée!

Si la vue de votre enfant dans la vue personnalisée empêche l'événement tactile, celle de vos parents

android: onClick sera ignoré.


0 commentaires