粗浅理解接口在Android开发中的用途

一直认为程序中写接口的都是大神级人物,自己不是大神就不用写接口,这样的理解让我很长时间都回避了接口的学习,最近自己用到了接口,有了自己粗浅的理解。下面是一个经典的场景:

当我们在Activity中调用Fragment弹出框,弹出框里面有个按钮,如果我想实现点击一次按钮,就通知Activity中一个TextView上显示的数字加一,该怎么实现?如果是以前我可能会想用Handle来实现,但是现在用接口,这也就理解了为什么叫接口回调:接口定义在Fragment中,但是实现在Acitivity中,Fragment中事件需要Activity来响应。

来看一个demo:在Activity中需要显示一个Frament

 

[java][/java] view plaincopyprint?

  1. private void showFragment(BaseGoods vagetable) {
  2.         Bundle args = new Bundle();
  3.         args.putSerializable(“goods”, vagetable);
  4.         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  5.         ModalFragment modalFragment = new ModalFragment();
  6.         modalFragment.setNotify(new ModalFragment.NotifyDataChangeListener() {
  7.             @Override
  8.             public void onGoodsNumChanage(int position, int goodsNum) {
  9.             }
  10.             @Override
  11.             public void onDelete(int position) {
  12.             }
  13.             @Override
  14.             public void onWaitChanage(int position) {
  15.             }
  16.         });
  17.         modalFragment.setArguments(args);
  18.         ft.setCustomAnimations(R.anim.bottom_enter, R.anim.bottom_exit,
  19.                 R.anim.bottom_enter, R.anim.bottom_exit);
  20.         ft.add(R.id.real_container, modalFragment, “modal”);
  21.         ft.addToBackStack(null);
  22.         ft.commit();
  23.     }

 

 

Framgent:

 

[html][/html] view plaincopyprint?

  1. public class ModalFragment extends Fragment {
  2.     private Modal mModal;
  3.     private int mPosition;
  4.     private String mGoodsName;
  5.     private float mGoodsPrice;
  6.     private int mGoodsNum;
  7.     private ContentValues mItem;
  8.     private NotifyDataChangeListener mNotifyNum;
  9.     public interface NotifyDataChangeListener {
  10.         public void onGoodsNumChanage(int position, int goodsNum);
  11.         public void onDelete(int position);
  12.         public void onWaitChanage(int position);
  13.     }
  14.     public void setNotify(NotifyDataChangeListener l) {
  15.         mNotifyNum = l;
  16.     }
  17.     @Override
  18.     public View onCreateView(LayoutInflater inflater, ViewGroup container,
  19.             Bundle savedInstanceState) {
  20.         mModal = new Modal(getActivity());
  21.         return mModal.getMidalContainer();
  22.     }
[html][/html] view plaincopyprint?

  1. <pre name=”code” class=”java”>  mModal.setOnPlusButtonClickListener(new Modal.OnPlusButtonClickListener() {
  2.             @Override
  3.             public void onClick(int num) {
  4.                 mGoodsNum++;
  5.                 chanageNoBuy();
  6.                 // mNotifyNum.onWaitChanage(mPosition);
  7.                 chanageDataBaseNum(num);
  8.                 mNotifyNum.onGoodsNumChanage(mPosition, num);
  9.             }
  10.         });</pre>}<br>
  11. <br>
  12. <p></p>
  13. <pre></pre>
  14. Fragment中定义了一个<pre name=”code” class=”html”>NotifyDataChangeListener 接口,里面有三个方法,</pre>Fragment中还有个接口的全局变量和
  15. <p></p>
  16. <p><span style=”font-size:18px”>public void setNotify(NotifyDataChangeListener l) {<br>
  17. <span style=”white-space:pre”></span>mNotifyNum = l;<br>
  18. <span style=”white-space:pre”></span>}</span></p>
  19. <p><span style=”font-size:18px”>在Activity中调用这个方法</span></p>
  20. <p><span style=”font-size:18px”></span></p><pre name=”code” class=”java”>modalFragment.setNotify(new ModalFragment.NotifyDataChangeListener() {
  21.             @Override
  22.             public void onGoodsNumChanage(int position, int goodsNum) {
  23.             }
  24.             @Override
  25.             public void onDelete(int position) {
  26.             }
  27.             @Override
  28.             public void onWaitChanage(int position) {
  29.             }
  30.         });</pre>并实现其中的三个方法,<br>
  31. 当Fragment中点点击事件调用了全局变量的mNotifyNum.onWaitChanage(mPosition);方法<span style=”font-size:18px”>的时候,就会去回调实现接口的方法,也就是Activity中的</span><pre name=”code” class=”java”>@Override
  32.             public void onWaitChanage(int position) {
  33.             }</pre><p></p>
  34. <p><span style=”font-size:18px”>这样也就实现了,在Fragment中操纵Activity,发散一下思维,也就是遇到当一个实现类想操纵使用它的父类的时候就可以用接口,我知道这样的说法不正确,但是就是那么个意思,我理解的。</span></p>

标签