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页面运行啦!ヽ(●´∀`●)ノ
2 0