Слушатель регистра привязки данных Android в xml для настраиваемой кнопки

Салам, Я написал специальную кнопку для поддержки векторных чертежей. Он отлично работает, но когда я пытаюсь зарегистрировать слушателя onClick в xml, я получаю следующую ошибку

 Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> android.databinding.tool.util.LoggedErrorException: Found data binding errors.
  ****/ data binding error ****msg:Could not find accessor com.tomycab.fragments.NoTripFragment.openPromoDialog and android.view.View has 0 abstract methods, so is not resolved as a listener
  file:C:\Users\Ramdane\AndroidStudioProjects\NEW OLD\tomycab\app\src\main\res\layout\frag_no_trip.xml
  loc:261:51 - 261:71
  ****\ data binding error ****

Вот мой код класса CustomButton

package com.tomycab.custom;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v7.content.res.AppCompatResources;
import android.support.v7.widget.AppCompatButton;
import android.util.AttributeSet;
import android.view.View;

import com.tomycab.R;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Created by ramdane on 9/18/17.
 */

public class CustomButton extends AppCompatButton implements View.OnClickListener {


    public static final Logger logger = Logger.getLogger(CustomButton.class.getName());

    private String onClickName;
    private OnClickListener listener;
    private final Context context;
    private boolean inited = false;

    public CustomButton(Context context) {
        super(context);
        this.context = context;
    }

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        initAttrs(context, attrs);
    }

    public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        initAttrs(context, attrs);
    }


    void initAttrs(Context context, AttributeSet attrs) {
        if (attrs != null) {

            TypedArray attributeArray = context.obtainStyledAttributes(
                    attrs,
                    R.styleable.CustomTextView);
            try {
                Drawable drawableLeft = null;
                Drawable drawableRight = null;
                Drawable drawableBottom = null;
                Drawable drawableTop = null;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    drawableLeft = attributeArray.getDrawable(R.styleable.CustomTextView_drawableLeftCompat);
                    drawableRight = attributeArray.getDrawable(R.styleable.CustomTextView_drawableRightCompat);
                    drawableBottom = attributeArray.getDrawable(R.styleable.CustomTextView_drawableBottomCompat);
                    drawableTop = attributeArray.getDrawable(R.styleable.CustomTextView_drawableTopCompat);
                } else {
                    final int drawableLeftId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableLeftCompat, -1);
                    final int drawableRightId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableRightCompat, -1);
                    final int drawableBottomId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableBottomCompat, -1);
                    final int drawableTopId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableTopCompat, -1);

                    if (drawableLeftId != -1)
                        drawableLeft = AppCompatResources.getDrawable(context, drawableLeftId);
                    if (drawableRightId != -1)
                        drawableRight = AppCompatResources.getDrawable(context, drawableRightId);
                    if (drawableBottomId != -1)
                        drawableBottom = AppCompatResources.getDrawable(context, drawableBottomId);
                    if (drawableTopId != -1)
                        drawableTop = AppCompatResources.getDrawable(context, drawableTopId);
                }


                int drawableTint = attributeArray.getColor(R.styleable.CustomTextView_drawableTintCompat,
                        ContextCompat.getColor(context, R.color.colorBlack));
                if (drawableLeft != null) {
                    DrawableCompat.setTint(drawableLeft, drawableTint);
                }
                if (drawableRight != null) {
                    DrawableCompat.setTint(drawableRight, drawableTint);
                }
                if (drawableTop != null) {
                    DrawableCompat.setTint(drawableTop, drawableTint);
                }
                if (drawableBottom != null) {
                    DrawableCompat.setTint(drawableBottom, drawableTint);
                }

                setCompoundDrawablesWithIntrinsicBounds(drawableLeft, drawableTop, drawableRight, drawableBottom);
            } finally {
                attributeArray.recycle();
            }
            onClickName = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "onClick");
            inited = true;
        }
    }

    @Override
    public void setOnClickListener(@Nullable OnClickListener l) {
        if (!inited) {
            this.listener = l;
            super.setOnClickListener(this);

        } else {
            super.setOnClickListener(l);
        }
    }

    @Override
    public void onClick(View view) {
        if (listener != null) {
            if (onClickName != null) {
                try {
                    Method m = context.getClass().getMethod(onClickName, View.class);
                    m.invoke(context, view);
                } catch (NoSuchMethodException ex){
                    logger.log(Level.WARNING, null, ex);
                } catch (InvocationTargetException ex){
                    logger.log(Level.WARNING, null, ex);
                } catch (IllegalAccessException ex){
                    logger.log(Level.WARNING, null, ex);
                }

            } else {
                listener.onClick(view);
            }
        }
    }
}

Пример XML

<com.tomycab.custom.CustomButton
                        android:id = "@+id/src_help"
                        android:layout_width = "wrap_content"
                        android:layout_height = "wrap_content"
                        android:background = "?attr/selectableItemBackgroundBorderless"
                        android:clickable = "true"
                        android:padding = "10dp"
                        app:drawableLeftCompat = "@drawable/ic_more_vert_black_24dp"
                        android:layout_toLeftOf = "@+id/src_popup"
                        android:layout_toStartOf = "@+id/src_popup"
                        android:onClick = "@{frag::onClick}"
                        />

Обратите внимание, что я правильно установил переменную frag и протестировал ее с помощью обычной кнопки, и она отлично работает

можешь показать xml?

Alan Todtenkopf 26.04.2018 17:28

Здравствуйте, я только что добавил пример XML. Когда я использую точно такой же синтаксис, код работает нормально, но когда я использую его со своей настраиваемой кнопкой, я получаю ошибку компиляции.

Ramdane Oualitsen 27.04.2018 12:17

Поделитесь NoTripFragment, а также всем макетом xml.

azizbekian 16.05.2018 12:14

Поделитесь, пожалуйста, целым фрагментом кода java и xml.

Leo supports Monica Cellio 21.05.2018 23:33

добавить R.styleable.CustomTextView

MJM 23.05.2018 05:37

@RamdaneOualitsen Это весь код, который вы используете, я не хочу ничего оставлять при ответе

Lucem 23.05.2018 10:21
4
6
295
0

Другие вопросы по теме

Похожие вопросы

Получение ошибки "не удалось объединить dex" в Android Studio
Как преобразовать List <Object> в PagedList <Object> и наоборот?
Android - «Не удается подключиться к службе камеры» - Как очистить / сбросить?
StartService () вызывает зависание потока пользовательского интерфейса
Как сделать так, чтобы представление выглядело так, будто оно выбирается программно, если есть фон? Android: attr / selectableItemBackground (ListView в AlertDialog)
Когда я пытаюсь запустить приложение JustJava coffe, оно останавливается и вообще не запускается. ПОЖАЛУЙСТА
Когда мое приложение работает на Android Studio Simulator, выравнивание текста центрируется, как ожидалось, но когда оно запускается на Samsung S2, выравнивание текста становится правильным
Как заставить Gradle создавать мое приложение даже с ошибками (root)?
Обычный текст со списком опций акций дает ошибку
Как я могу обновить текст TextView, если TextView находится во включенном действии?