从 Button 继承 onClick 属性

Posted

技术标签:

【中文标题】从 Button 继承 onClick 属性【英文标题】:Inherit onClick attribute from Buttom 【发布时间】:2021-10-10 20:41:28 【问题描述】:

我正在从 Button 构建自定义视图,并且我想继承 XML 上的 onClick 属性。我检查了View源代码并试图复制它,但它使用了私有类AppCompatViewInflater.DeclaredOnClickListener

    case R.styleable.View_onClick:
        if (context.isRestricted()) 
            throw new IllegalStateException("The android:onClick attribute cannot "
                    + "be used within a restricted context");
        

        final String handlerName = a.getString(attr);
        if (handlerName != null) 
            setOnClickListener(new DeclaredOnClickListener(this, handlerName));
        
        break;

我觉得应该有一种更简单的方法可以做到这一点,而无需进入这个兔子洞。

我目前收到此错误:

    <com.domain.SomeButton
        <!---Other stuff-->
        android:onClick="@() -> viewmodel.doSomething()" />
Cannot assign callback expression to 'android:onClick'

Make sure you aren't using lambda syntax if the expression should only return a value directly

有像this one这样的相关问题,但它们没有答案而且很旧。

谢谢!

【问题讨论】:

你所说的“继承”到底是什么意思?如果您打算复制完全相同的行为,无论出于何种原因,您都可以复制该 OnClickListener 实现,但我不确定您为什么要这样做。它所做的只是使用反射来尝试找到方法并执行它。或者只是根据该属性值创建您自己的OnClickListener,但您想使用它。 嘿迈克。我在帖子中解释说我无法复制 impl,因为这些类不是公开的。我想用我在 XML 中的自定义视图替换“按钮”,并使其保持工作而不需要任何更改。理想情况下,我想使用基础View impl(这就是我所说的“继承”),它应该更容易维护。 “我在帖子中解释说我无法复制 impl,因为这些类不是公开的。” ——嗯?这对浏览器/编辑器中的右键单击复制/粘贴选项有何影响? “我想更换‘按钮’……让它继续工作,无需任何改动。” – 您完全可以在不触及该属性的情况下做到这一点,因为View 类将为android:onClick 属性设置平台等效处理程序。您的总体问题尚不清楚,但如果您认为该属性特定于 Button 类,则不是。它适用于任何View,即使没有 appcompat 充气器。 嗨,迈克。对不起,我没有清楚地表达自己。当然,我可以复制粘贴,但是当 Google 维护的机制已经到位时,我不想这样做。 您已经可以在完全不触及该属性的情况下做到这一点,我不能,我用我的 XML 和错误更新了帖子。我希望任何View 都采用onClick,但它不起作用,所以我的假设是子类型没有继承属性。 我知道这可能有点令人困惑,但那是完全不同的事情。那是数据绑定,它的框架将在构建时处理 onClick 属性,而不是在运行时处理 LayoutInflater,既不是平台类,也不是您链接到的 appcompat 工厂。我从来没有对数据绑定做过很多事情,所以我不确定具体出了什么问题,但这应该会给你更好的搜索线索。如果有机会,我以后可能会研究一下。 【参考方案1】:

正如 cmets 中所讨论的,android:onClick 不绑定到 Button 或特定的 View。默认情况下,任何View 都有它。我的问题是它与其他东西发生冲突。

这是我的Button 实现:

class SomeButton() : Button, View.OnClickListener 

    // Constructors ignored

    override fun onClick(v: View) 
        // Code
    

这个override fun onClick 正在干扰android:onClick XML 属性。删除它可以解决问题,但使用 android:onClickListener 也可以。

【讨论】:

以上是关于从 Button 继承 onClick 属性的主要内容,如果未能解决你的问题,请参考以下文章

666

javaweb使用button的onclick属性访问servlet

Android Studio的Button控件的onClick属性setOnClickListener函数与OnClickListener接口用法

Angular 2+:使用 onclick 更改属性

button的两个onClick函数

button的onclick属性赋值时除了给个js方法,能不能给个常量?