Android:在自定义视图上使用android绑定点击事件

Posted

技术标签:

【中文标题】Android:在自定义视图上使用android绑定点击事件【英文标题】:Android :Use android binding click event on custom view 【发布时间】: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_
                    android:layout_
                    app:progress_
                    app:progress_
                    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) 【参考方案1】:

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

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

【讨论】:

以上是关于Android:在自定义视图上使用android绑定点击事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义 Android 视图中检查重力标志?

在自定义视图中获取 LinearLayout 参考

Android:需要在自定义适配器列表视图中保存复选框状态

Android:在自定义 Web 视图中检测并打开外部链接

Android - 自定义列表视图项始终位于左侧

Android:在自定义键盘上添加 imageButton