Activity 與 DialogFragment 之間的資料傳遞
阿新 • • 發佈:2018-11-27
這篇文章參考了網友的相關資料(因為參考了多名前輩的資料,這裡就不一一指明出處了),不過還是非常感謝前輩們的無私分享。此文僅是學習過後的總結,主要目的是以後自己看著方便,如果恰巧能幫到你那也是再好不過了。(文中程式碼並不全,只是概括了思路,是從我目前的專案中拆下來的)
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);
}
}
以上程式碼並不全面,僅為關鍵程式碼,表達這個思路,不要直接粘到專案中去。