Activity與Fragment通信——回調方法實現

Activity與Fragment通信——回調方法實現

1. 回調方法的介紹:

  • 所謂回調,就是客戶程序C調用服務程序S中的某個函數A,然後S又在某個時候反過來調用C中的某個函數B,對於C來說,這個B便叫做回調函數。例如Win32下的窗口過程函數就是一個典型的回調函數。一般說來,C不會自己調用B,C提供B的目的就是讓S來調用它,而且是C不得不提供。由於S並不知道C提供的B姓甚名誰,所以S會約定B的接口規範(函數原型),然後由C提前通過S的一個函數R告訴S自己將要使用B函數,這個過程稱爲回調函數的註冊,R稱爲註冊函數。Web Service以及Java的RMI都用到回調機制,可以訪問遠程服務器程序。

下面舉個通俗的例子:

  • 某天,我打電話向你請教問題,當然是個難題,^_^,你一時想不出解決方法,我又不能拿着電話在那裏傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。這個例子說明了“異步+回調”的編程模式。其中,你後來打手機告訴我結果便是一個“回調”過程;我的手機號碼必須在以前告訴你,這便是註冊回調函數;我的手機號碼應該有效並且手機能夠接收到你的呼叫,這是回調函數必須符合接口規範。
—–以上內容摘自網絡

2. Activity與Fragment利用回調方法進行通信

Fragment向Activity發送消息:

  1. 創建回調方法接口類

    public interface MyCallBack {   
        public void callBack(String message);
    }
    
  2. 讓Activity實現該接口 並 實現接口定義的方法

    public class MainActivity extends Activity implements MyCallBack{
        ......
        @Override
        public void callBack(String message) {
            Log.d("myinfo", "MainActivity接受到的消息是:" + message);
        }
    }
    
  3. 在Fragment中獲取與其綁定的Activity的引用(這裏onAttach()方法要注意,後面會講到)

    public class MyFragment extends Fragment {      
        private MyCallBack myCallBack;      
        ......
    
            @Override
            public void onAttach(Context context) {
                super.onAttach(context);
    
                if (!(context instanceof MyCallBack)) {
                    throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!");
                }
                myCallBack = (MyCallBack) context;
            }
    }
    
  4. 在Fragment中向Activity傳遞消息

    myCallBack.callBack("這是從MyFragment發出的消息!");
    

注意:

Fragment的生命週期方法有兩個onAttach()方法,根據Android版本的不同會調用不同的方法

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        if (!(activity instanceof MyCallBack)) {
            throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!");
        }
        myCallBack = (MyCallBack) activity;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        if (!(context instanceof MyCallBack)) {
            throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!");
        }
        myCallBack = (MyCallBack) context;
    }

具體代碼:

MyCallBack:

    package com.zhenggy.test;

    /**
     * Created by ashzheng on 2016/6/14.
     */
    public interface MyCallBack {

        public void callBack(String message);
    }

MainActivity:

    package com.zhenggy.test;

    import android.app.Activity;
    import android.app.FragmentManager;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.util.Log;

    public class MainActivity extends Activity implements MyCallBack {


        private FragmentManager fragmentManager;
        private MyFragment myFragment;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            if (null != myFragment) {
                fragmentTransaction.show(myFragment);
            } else {
                myFragment = new MyFragment();
                fragmentTransaction.add(R.id.activity_main_show_fragment_layout, myFragment);
            }
            fragmentTransaction.commit();
        }

        @Override
        public void callBack(String message) {
            Log.d("myinfo", "MainActivity接受到的消息是:" + message);
        }
    }

MyFragment:

    package com.zhenggy.test;

    import android.app.Activity;
    import android.app.Fragment;
    import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;


    /**
     * Created by ashzheng on 2016/6/14.
     */
    public class MyFragment extends Fragment {

        private MyCallBack myCallBack;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            View myFragment = inflater.inflate(R.layout.fragment_my, container, false);

            myFragment.findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.d("myinfo", "MyFragment發出消息");
                    myCallBack.callBack("這是從MyFragment發出的消息!");
                }
            });


            return myFragment;
        }

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);

            if (!(activity instanceof MyCallBack)) {
                throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!");
            }
            myCallBack = (MyCallBack) activity;
        }

        @Override
        public void onAttach(Context context) {
            super.onAttach(context);

            if (!(context instanceof MyCallBack)) {
                throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!");
            }
            myCallBack = (MyCallBack) context;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章