我有一個片段調用另一個片段(DialogFragment)。我知道這不是最佳做法,這就是爲什麼我問。Android:在另一片段調用片段的DatePickerDialog - 發送數據
在片段1我有一個EditText,它提供了一個日期選取器對話框onClick作爲片段。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = (LinearLayout)inflater.inflate(R.layout.tab_frag1_layout, container, false);
EditText dateInput = (EditText) view.findViewById(R.id.editTextGeb);
dateInput.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDatePicker();
}
});
return view;
}
private void showDatePicker() {
DatePickerFragment date = new DatePickerFragment();
// set date of today
Calendar calender = Calendar.getInstance();
Bundle args = new Bundle();
args.putInt("year", calender.get(Calendar.YEAR));
args.putInt("month", calender.get(Calendar.MONTH));
args.putInt("day", calender.get(Calendar.DAY_OF_MONTH));
date.setArguments(args);
date.setCallBack(ondate);
date.show(getChildFragmentManager(), "Date Picker");
}
OnDateSetListener ondate = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Log.i(TAG, text);
// here is the place to find the right element
}
};
這裏是DatePickerFragment:
public class DatePickerFragment extends DialogFragment {
private static final String TAG = "DatePickerFragment";
OnDateSetListener ondateSet;
private int year;
private int month;
private int day;
public DatePickerFragment() {}
public void setCallBack(OnDateSetListener ondate) {
ondateSet = ondate;
}
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
year = args.getInt("year");
month = args.getInt("month");
day = args.getInt("day");
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new DatePickerDialog(getActivity(), ondateSet, year, month, day);
}
我的問題是:如何獲得的日期從我DatePickerFragment到我的EditText元素?我無法通過view.findViewById(R.id.editTextGeb);
來請求它,因爲我的視圖不正確,找不到正確的EditText元素。 我需要通過託管活動進行溝通嗎?如果有的話,是否有一個很好的例子?
我找到了答案。
我實際上有一個片段被動態地附加到一個FrameLayout(我在我的項目中使用標籤)。因此我無法通過ID找到它,只好調用它的父元素!有什麼幫助我理解這裏的問題一個很好的解釋:Get Fragment dynamically attached to <FrameLayout>?
我使用谷歌提供的DatePickerFragment:http://developer.android.com/guide/topics/ui/controls/pickers.html
在主活動類我實現DatePickerDialog.OnDateSetListener並覆蓋其onDataSet()方法。在該方法中,我調用片段的PARENT元素來訪問我的片段。
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
Tab1Fragment tab1 = (Tab1Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);
EditText et = (EditText) tab1.getView().getRootView().findViewById(R.id.editTextGeb);
et.setText(day + "." + month + "." + year);
}
就是這樣。感謝您的幫助。根據文檔應避免直接片段到片段通信。
經過簡單的Google搜索,我找到了http://developer.android.com/guide/topics/ui/controls/pickers.html和http://stackoverflow.com/questions/11754663/android-datepicker-fragment - 當用戶設置日期時如何做某事。這兩者之間有什麼問題? – BLaZuRE
感謝您的回答。這些沒有錯。你的回答使我重新思考我的整個代碼,並將其刪除。問題更深,我試圖解釋下面進一步發生的事情。 – aszel