fragment android:onclick,Android Fragment的布局中使用android:onClick 属性时需要注意的问题...

博客详细解释了在Android中遇到点击事件onClick在Fragment中找不到对应方法的问题,原因是Fragment并非Context,因此定义在Fragment中的方法无法被View通过反射调用。解决方法是将回调方法定义在Fragment的宿主Activity中。文章还探讨了View查找方法的机制,强调了理解Context和Fragment的区别对于解决问题的重要性。
摘要由CSDN通过智能技术生成

问题:

下面是一个在fragment的布局中定义的一个点击事件

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:contentDescription="@null"

android:onClick="onMessageViewClick"

android:clickable="true"

android:focusable="true" />

按照常规操作,我们需要在宿主中定义一个名为 onMessageViewClick 的public 方法public void onMessageViewClick(View v) {

dosomething...

}

这样看起来没什么问题,但是跑起来直接报错:java.lang.IllegalStateException: Could not find method xxx in a parent or ancestor Context for android:onClick attribute defined on view class

解决方法:

在持有fragment的activity中定义改方法即可

原因分析:

1.报错信息:无法在对应的context中找到名为 onMessageViewClick  的方法(其实这里已经说的很明白了,找不到方法,在view的context中)

那看一下当我们点击view的时候系统是怎么寻找对应的方法的:

直接上截图,下面是view类中的一个内部类

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

看一下属性就明白这个类似干什么的了(膜拜)

mHostView:定义了onClick属性的view

mMethodName:方法名称

mResolvedContext:反射对象

mResolvedMethod:反射方法

所以view是通过反射的方式来调用方法的(大家应该不看源码都知道的),这里的mResolvedContext 是通过View.getContext获取的

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

那么,view的context中为什么找不到方法呀,我都定义了不是吗。但是,注意一下,我们定义的方法是在Fragment中,fragment,fragment是context吗?当然不是,看看fragment class的定义

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

fragment有生命周期,是视图的管理者,并不是context,所以你把方法定义在fragment中系统当然找不到。

那么view的context是谁呢?fragment的使用范围里,除了activity是Context外还有谁呢(滑稽)。

作者:雅卅夕

链接:https://www.jianshu.com/p/acd5caca0ad9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值