1. 程式人生 > >Java回撥機制(以Android事件監聽器為例)

Java回撥機制(以Android事件監聽器為例)

Java的設計模式中有回撥這個機制,在Android開發中我們也會經常用到回撥機制。下面就通過一些小例子來說明什麼是回撥。

假如我們要實現這個這樣一個功能。

MainActivity中由一個Fragment和一個ViewPager構成,Fragment中有一系列按鈕,通過按下這些按鈕可以來切換ViewPager的當前頁卡,一般我們會這麼實現。

首先在Fragment中獲得MainActivity。

private MainActivity activity;//Frgament的成員變數
@Override
public void onStart() {//Fragment的onStart方法
    super.onStart();
    activity = (MainActivity) getActivity();
}

然後再Fragment中的button的點選事件中,獲取activity中的ViewPager例項,然後執行setcurrentItem()方法。

mViewHolder.item1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        activity.mViewPager.setCurrentItem(2);
    }
});

這樣做我們就實現了功能。

接下來,同樣的功能,我們如果使用回撥機制的話。是這樣實現的。

首先寫一個介面。

public interface OnToolBarSelectListener {
    public void onSelect(int postion);
}

看名字就知道了,在按鈕按下的時候的監聽器。

然後在MainActivity中實現這個介面。

public class MainActivity extends Activity implements OnToolBarSelectListener {
    private Context mContext; 
    private ViewPager mViewPager; 
    private ToolBarFragment toolBarFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this; 
    }
    @Override
    public void onSelect(int position) {
        mViewPager.setCurrentItem(position); 
    }

}


同時在Fragment中,我們要獲取MainActivity。同時在控制元件的點選事件中執行介面中的方法。

public class ToolBarFragment extends BaseFragment implements OnViewPagerSlideListener {

    private MainActivity activity; 
    private OnToolBarSelectListener mOnToolBarSelectListener;

    public void setOnToolBarSelectListener(OnToolBarSelectListener mOnToolBarSelectListener) {
        this.mOnToolBarSelectListener = mOnToolBarSelectListener;
    }

    @Override
    public void onStart() {
        super.onStart();
        this.setOnToolBarSelectListener((MainActivity) getActivity());
        mViewHolder.item1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mOnToolBarSelectListener.onSelect(1);
        }
    });	
    }
}


首先MainActivity實現了介面,然後在onSelect方法中做好點選之後要做的事情。

然後在Fragment中,獲得這個介面的例項,並在相應的地方處理(點選事件監聽中)。

在本例中,其實OnToolBarSelectListener是沒有必要寫set方法的,因為直接就在Frgament中處理了,但是如果需要換別的地方處理,一個set方法可以讓你的程式更有條理。

後面的解決方案在當前需求的情況下,的確有些畫蛇添足了。

但是這樣的做法的確是遵循了JAVA的設計模式,在需求情況比較複雜的情況下這麼寫,程式碼的維護性會很高。

參考:http://blog.csdn.net/xiaanming/article/details/8703708/

http://blog.csdn.net/pi9nc/article/details/23169357