您的位置:首页 > 其它

以前我也不懂什么是回调函数

2015-10-31 14:09 363 查看
转载请注明出处:/article/10037879.html

我这个人就是这样,如果想弄明白一个工具,我必须首先了解故事发生在什么样的场景,从而能够去了解为满足这样的情形 工具的运作机制

回调函数就是其中一个

以前我也不懂什么是回调函数,百度Google输入“回调函数”,网上教程大都举些奇奇怪怪的场景“帮助你理解”回调函数是怎么一回事,然而“小明现在没空,待会帮你解决问题并回复”的奇葩示例无益于帮我理解回调函数,反倒越看越晕

直到学了Fragment,我才弄明白回调函数存在的意义

场景:代码复用



现实中我们可能会遇到类似的情形,即存在多个Activity,它们的布局大致相同,但按钮的点击事件不同

如果每个Activity都写同样的布局,实例化同样的控件,这样重复代码就很多,也不易于编辑和管理

因此想到将布局和控件的实例化写在一个fragment中,供多个Activity调用

那么问题来了,原本是每个Activity为自己单独写的按钮点击事件,现在多个Activity调用同一个fragment,点击事件怎么写?难道要将所有Activity的按钮点击事件都写在一个fragment中,然后传值判断是哪个Activity调用的就执行哪个方法?

理论上可行,但是这样不能够体现代码复用的精神

我们希望的结果是解耦,即,不管哪个Activity的去留,fragment自身的内容都不用做改动

因此诉诸回调函数:

首先在fragment中声明一个接口,接口中定义一个空方法体

public interface ButtonClickListener {

voidbuttonClick();

}


然后在fragment的按钮点击事件中调用这个空方法体,方法的具体内容留给Acitivity去实现

bt.setOnClickListener(newView.OnClickListener() {

@Override

public void onClick(View view) {

//此处安插一个空方法体,如果Activity实例化了这个接口,就实现这个回调函数

if(getActivity()instanceof ButtonClickListener)

((ButtonClickListener) getActivity()).buttonClick();

}

});


这样,多个Acitivity既能调用同一个fragment,又能在各自的Activity类中定义不同的按钮点击事件

如ActivityOne中:

public class ActivityOne extends AppCompatActivity implements FragmentOne.ButtonClickListener {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_one);

getFragmentManager().beginTransaction()

.add(R.id.frag_container, new FragmentOne())

.commit();

}

@Override

public void buttonClick() {

//此处写入具体的实现

Toast.makeText(getApplicationContext(), "我是Activity One啊", Toast.LENGTH_SHORT).show();

}

}


就是这样

回调函数就是,在一个(用于复用的)类中,通过接口定义一个空方法体,在相应的操作中调用这个空方法体,并将方法的具体实现放在实现类中(,从而达到代码复用的目的)

此处附上源码实例

http://download.csdn.net/detail/github_32453995/9229715

转载请注明出处:/article/10037879.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: