1. 程式人生 > >Activity 與 DialogFragment 之間的資料傳遞

Activity 與 DialogFragment 之間的資料傳遞

這篇文章參考了網友的相關資料(因為參考了多名前輩的資料,這裡就不一一指明出處了),不過還是非常感謝前輩們的無私分享。此文僅是學習過後的總結,主要目的是以後自己看著方便,如果恰巧能幫到你那也是再好不過了。(文中程式碼並不全,只是概括了思路,是從我目前的專案中拆下來的)

Activity向DialogFragment傳遞資料,採用setArguments( Bundle )、getArguments( Bundle )方法傳遞資料。這個有些類似Activity之間通過Intent傳遞資料。

Activity中的程式碼為

    // 列表項監聽器(這裡點選列表項彈出一個自定義的DialogFragment)
ListView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { // MyDialogFragment 為自定義的 DialogFragment ------------- MyDialogFragment myDialogFragment = new
MyDialogFragment(); Bundle bundle = new Bundle(); bundle.putInt("Data01", 11111); bundle.putInt("Data02", 22222); bundle.putInt("Data03", 33333); myDialogFragment.setArguments(bundle); myDialogFragment.show(getFragmentManager(), "DialogFragment"
); } };

MyDialogFragment中的程式碼為

public class MyDialogFragment extends DialogFragment {

   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 接收關聯Activity傳來的資料 -----
        Bundle bundle = getArguments();
        if (bundle != null) {
            int data01 = bundle.getInt("Data01");
            int data02 = bundle.getInt("Data02");
            int data03 = bundle.getInt("Data03");
            Log.d("Tag", "Data01: " + data01 + " Data02: " + data02 + " Data03: " + data03);
        }
   }
   ......
}

DialogFragment向Activity傳遞資料,採用介面的方式傳遞資料。在DialogFragment宣告一個介面,然後在Activity中呼叫這個介面。

MyDialogFragment中的程式碼為

public class MyDialogFragment extends DialogFragment {

    private View view;
    private MyDialogFragment_Listener myDialogFragment_Listener;

    // 回撥介面,用於傳遞資料給Activity -------
    public interface MyDialogFragment_Listener {
        void getDataFrom_DialogFragment(int Data01, int Data02, int Data03);
    }

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

        try {
            myDialogFragment_Listener = (MyDialogFragment_Listener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implementon MyDialogFragment_Listener");
        }
    }

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

        // 接收關聯Activity傳來的資料 -----
        Bundle bundle = getArguments();
        if (bundle != null) {
            int data01 = bundle.getInt("Data01");
            int data02 = bundle.getInt("Data02");
            int data03 = bundle.getInt("Data03");
            Log.d("Tag", "Data01: " + data01 + " Data02: " + data02 + " Data03: " + data03);
        }

        // 去掉對話方塊預設標題欄
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);

        // 加在自定義介面
        view = inflater.inflate(R.layout.my_dialog, container);

        return view;
    }

    // DialogFragment關閉時回傳資料給Activity
    @Override
    public void onDestroy() {
        // 通過介面回傳資料給activity
        if (myDialogFragment_Listener != null) {
            myDialogFragment_Listener.getDataFrom_DialogFragment(0, 0, 7);
        }
        super.onDestroy();
    }
}

Activity中的程式碼為

public class Activity_AirCondition_AdvancedSettings extends Activity // 這裡要implements剛才的介面
        implements MyDialogFragment.MyDialogFragment_Listener {

    // 引用介面中定義的方法
    @Override
    public void getDataFrom_DialogFragment(int data01, int data02, int data03) {
        Log.d("Tag", "DialogFragment回傳的資料為:" + data01 + " " + data02 + " " + data03);
    }

}

以上程式碼並不全面,僅為關鍵程式碼,表達這個思路,不要直接粘到專案中去。