一直认为程序中写接口的都是大神级人物,自己不是大神就不用写接口,这样的理解让我很长时间都回避了接口的学习,最近自己用到了接口,有了自己粗浅的理解。下面是一个经典的场景:
当我们在Activity中调用Fragment弹出框,弹出框里面有个按钮,如果我想实现点击一次按钮,就通知Activity中一个TextView上显示的数字加一,该怎么实现?如果是以前我可能会想用Handle来实现,但是现在用接口,这也就理解了为什么叫接口回调:接口定义在Fragment中,但是实现在Acitivity中,Fragment中事件需要Activity来响应。
来看一个demo:在Activity中需要显示一个Frament
private void showFragment(BaseGoods vagetable) {
Bundle args = new Bundle();
args.putSerializable("goods", vagetable);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ModalFragment modalFragment = new ModalFragment();
modalFragment.setNotify(new ModalFragment.NotifyDataChangeListener() {
@Override
public void onGoodsNumChanage(int position, int goodsNum) {
}
@Override
public void onDelete(int position) {
}
@Override
public void onWaitChanage(int position) {
}
});
modalFragment.setArguments(args);
ft.setCustomAnimations(R.anim.bottom_enter, R.anim.bottom_exit,
R.anim.bottom_enter, R.anim.bottom_exit);
ft.add(R.id.real_container, modalFragment, "modal");
ft.addToBackStack(null);
ft.commit();
}
public class ModalFragment extends Fragment {
private Modal mModal;
private int mPosition;
private String mGoodsName;
private float mGoodsPrice;
private int mGoodsNum;
private ContentValues mItem;
private NotifyDataChangeListener mNotifyNum;
public interface NotifyDataChangeListener {
public void onGoodsNumChanage(int position, int goodsNum);
public void onDelete(int position);
public void onWaitChanage(int position);
}
public void setNotify(NotifyDataChangeListener l) {
mNotifyNum = l;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mModal = new Modal(getActivity());
return mModal.getMidalContainer();
}
}mModal.setOnPlusButtonClickListener(new Modal.OnPlusButtonClickListener() { @Override public void onClick(int num) { mGoodsNum++; chanageNoBuy(); // mNotifyNum.onWaitChanage(mPosition); chanageDataBaseNum(num); mNotifyNum.onGoodsNumChanage(mPosition, num); } });
Fragment中定义了一个Fragment中还有个接口的全局变量和NotifyDataChangeListener 接口,里面有三个方法,
public void setNotify(NotifyDataChangeListener l) {
mNotifyNum = l;
}在Activity中调用这个方法
并实现其中的三个方法,modalFragment.setNotify(new ModalFragment.NotifyDataChangeListener() { @Override public void onGoodsNumChanage(int position, int goodsNum) { } @Override public void onDelete(int position) { } @Override public void onWaitChanage(int position) { } });
当Fragment中点点击事件调用了全局变量的mNotifyNum.onWaitChanage(mPosition);方法的时候,就会去回调实现接口的方法,也就是Activity中的@Override public void onWaitChanage(int position) { }
这样也就实现了,在Fragment中操纵Activity,发散一下思维,也就是遇到当一个实现类想操纵使用它的父类的时候就可以用接口,我知道这样的说法不正确,但是就是那么个意思,我理解的。