开始学习安卓时,被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页面运行啦! ヽ(●´∀`●)ノ