Android fragment XML中的button找不到Onclick函数的解决方法

本文详细解析了Android开发中onClick属性与OnClickListener机制的异同,并通过实例展示了如何在Fragment页面中正确使用OnClickListener解决onClick无法直接作用于Fragment的问题。
摘要由CSDN通过智能技术生成

开始学习安卓时,被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";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.activity_settingmain, null);
		//通过id找到需要被监听的button
		btnToInterest= (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页面运行啦! ヽ(●´∀`●)ノ
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值