从 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 属性的主要内容,如果未能解决你的问题,请参考以下文章
javaweb使用button的onclick属性访问servlet
Android Studio的Button控件的onClick属性setOnClickListener函数与OnClickListener接口用法