Android fragment XML中的button找不到Onclick函数的解决方法
来源:互联网 发布:window10下安装ubuntu 编辑:程序博客网 时间:2024/05/01 23:47
开始学习安卓时,被XML中的onClick方法深深吸引,只需在Java文件中定义好相关函数,然后在onClick属性中设置要调用的函数名即可,每次都被这种简单而高效的神奇方法折服……一直很好奇为什么有这么好用的onClick属性,还有那么多人要去舍近求远的设置onClickListener,重写onclick函数呢。
直到有一次与与别人合代码时——具体工作是将我写的几个页面移植到队友写的mainActivity中的几个fragment里,我无脑把XML文件拷过去,把对应函数拷到每个fragment的java文件中,结果发现!我的所有onclick函数都坏了!0口0||| 每次点按钮整个项目就崩掉!
报以下错:
java.lang.IllegalStateException: Could not find method ToInterest(View) in a parent or ancestor Context for android:
onClick attribute defined on view class android.widget.Button with id 'changeInterest'查过一些资料后才发现,原来onclick属性并不能用到fragment的xml里……由于fragment是存储在inflater里的,只有fragment生成后才可才能通过ID找到fragment中的元素,这样直接的给onClick指定函数名,显然没有给函数和按钮之间提供直接的对应关系。所以报错提示没有找到想要的函数。
那么这时候我才开始思考OnClickListener存在的意义,明白了原来android: onClick 与 OnClickListener原来是完全相同的机制:View.OnclickListener是一个接口,定义了onclick这函数,如果你使用onclick函数时没有实现OnclickListener这个接口,android会自己帮你调用这个接口。如果你手动实现了这个接口,java后台便不需要帮你实现,只需等待click这个动作并调用OnclickListner中的函数即可。那么既然java可以自动帮我们实现这个接口,为什么我们还要手动定义呢?这是Onclick的局限性所致,onclick只能在当前的Activity中寻找函数,因为通过程序代码设置OnclickListener我们可以在onCreateView中处理点击事件,XML的onclick却不能,这也就导致了我前面所遇到的问题。
那么找到原因问题就就好解决了,在onCreateView中使用onclicklistener监听点击事件,具体代码如下:
Java文件:
public class activity_settingmain extends Fragment {Button btnToInterest;private static final String TAG = "activity_settingmain";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.activity_settingmain, null);//通过id找到需要被监听的buttonbtnToInterest= (Button)view.findViewById(R.id.changeInterest);btnToInterest.setOnClickListener(new View.OnClickListener(){//为找到的button设置监听@Override//重写onClick函数public void onClick(View v){ToInterest(v)}});return view;}public void ToInterest(View view){//此处定义点击后需要进行的操作,以下代码实现了简单地页面跳转 Intent intent = new Intent(activity_settingmain.this.getActivity(), ModifyGender.class);startActivity(intent);}}XML文件:
<Button style="@style/arrowButton" android:id="@+id/changeInterest" android:text=">" android:onClick="ToInterest"/>
现在onclick函数就可以顺利的在fragment页面运行啦!ヽ(●´∀`●)ノ
- Android fragment XML中的button找不到Onclick函数的解决方法
- Android:在Fragment中,onClick失效的解决方法
- button按钮onclick调用的函数名和id相同会导致找不到函数
- Android Button 添加 onclick 属性的注意事项
- Android中Button的onClick实现方法。
- button,android:onClick=""
- 覆写Button中的onClick函数时注意
- button的onclick功能
- Button的onClick属性
- button的onclick事件
- button的onclick时间
- ListView中的组件Button的OnClick事件触发时机
- android:onClick 设置Button监听
- Android-Button事件响应,onClick()
- 找不到ServiceRegistryBuilder()函数的解决方法
- Android开发之button的onClick事件学习
- Android Button onClick事件的三种写法
- Android Button onClick事件的三种写法
- ARP地址解析过程(同一子网和不同子网)
- 一个类似聊天气泡的自定义view 带个小箭头那种
- html5在网页中调用百度地图
- Android Hierarchy View在工作的使用
- Android 常见错误
- Android fragment XML中的button找不到Onclick函数的解决方法
- jqgrid快速入门之一:配置及第一个demo
- 剑指offer之面试题37两个链表的第一个公共结点
- Fatal Error[e72]: Segment FIQ_STACK must be defined in a segment definition option (-Z, -b or -P)
- URI和URL的区别
- Rumtime完整总结
- Python学习笔记001
- 安装Android-Studio遇到的问题
- 关于Laravel的二、三事(1)一次请求的生命周期