【问题标题】:Android :Use android binding click event on custom viewAndroid:在自定义视图上使用android绑定点击事件
【发布时间】:2019-08-06 07:24:36
【问题描述】:

我创建了自定义视图。我的课程从RelativeLayout 扩展而来,在我的课程中我创建了按钮和进度条视图并将这些视图添加到我的课程中:

public class CircleProgressButton extends RelativeLayout {...

private void initView(Context context, AttributeSet attrs) {
    TypedArray typedArray = context.getTheme().obtainStyledAttributes(
            attrs, R.styleable.ProgressButton, 0, 0
    );
    try {
        progressHeight = typedArray.getInt(R.styleable.ProgressButton_progress_height, progressHeight);
        progressWidth = typedArray.getInt(R.styleable.ProgressButton_progress_width, progressWidth);
        progressIconSuccess = typedArray.getResourceId(R.styleable.ProgressButton_progress_iconSuccess, R.drawable.ic_done);
        progressIconFail = typedArray.getResourceId(R.styleable.ProgressButton_progress_iconfail, R.drawable.ic_fail);
        progressText = typedArray.getString(R.styleable.ProgressButton_progress_text);
        progressBackgroundImage = typedArray.getDrawable(R.styleable.ProgressButton_progress_button_background);
    } finally {
        typedArray.recycle();
    }

    initButton();
    initProgressBar();
    initImageView();
}

我在 MarhalehFragment 中使用我的类,如下所示:

<com.tazik.circleprogressbutton.CircleProgressButton
                    android:id="@+id/btn_save"
                    android:layout_width="150dp"
                    android:layout_height="70dp"
                    app:progress_height="30"
                    app:progress_width="30"
                    app:progress_text = "@string/save_btn"
                    app:progress_iconfail="@drawable/ic_fail"
                    app:progress_iconSuccess="@drawable/ic_done"
                    app:progress_button_background="@drawable/mybutton"
                    android:onClick="@{handlers::onSaveClicked}"/>

如您所见,我在自定义视图中使用了 android 绑定 @{handlers::onSaveClicked}

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

    <data>

        <variable
            name="handlers"
            type="com.tazik.engineer.fragment.MarhalehFragment.ClickHandlers" />
    </data>

在主片段中我绑定它的布局

binding = DataBindingUtil.inflate(inflater, R.layout.fragment_marhaleh, container, false);

并创建我的处理程序类的实例并添加到绑定中:

binding.setHandlers(new ClickHandlers());

这是我的 ClickHandler 类:

public class ClickHandlers {

    public void onSaveClicked(View view) {
        saved = true;
        Log.i("======", "onSaveClicked: ");
    }

但是当我通过android:onClick="@{handlers::onSaveClicked}" 点击我的自定义视图时,ClickHandlers 中的onSaveClicked 没有触发?我的处理程序类和我的绑定没有任何问题,因为我有其他按钮并且单击它会在 ClickHandlers 中触发自己的方法。

我的问题是什么?

【问题讨论】:

  • binding 有很多这样的问题,而且不好理解,尝试使用kotlin,效果会好很多
  • 如果我使用简单的按钮,我没有任何问题,但我制作了一个自定义视图,我想在我的项目中使用......我还是卡住了@LakhwinderSingh
  • 你试过@{()-&gt;handlers.onSaveClick()}吗?
  • 我尝试使用您的建议,但我得到了这个error:msg:cannot find method onSaveClicked() in class com.......fragment.MarhalehFragment.ClickHandlers file:D:\Projects\....\src\main\res\layout\fragment_marhaleh.xml。我的处理程序类@ZohaibAmir 中有 onSaveClicked()
  • @sayreskabir 在视图中传递,因为您的函数正在使用视图参数@{(view)-&gt;handlers.onSaveClick(view)}

标签: android android-custom-view android-binder


【解决方案1】:

在 onClick 属性中使用 lambda,因为您使用的是数据绑定表达式,并且该表达式必须具有有效的 Java 代码:

 android:onClick="@{(view)->handlers.onSaveClicked(view)}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2016-06-05
    • 1970-01-01
    相关资源
    最近更新 更多