2013-07-25 77 views
3

我有一個片段調用另一個片段(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); 
} 

就是這樣。感謝您的幫助。根據文檔應避免直接片段到片段通信。

+0

經過簡單的Google搜索,我找到了http://developer.android.com/guide/topics/ui/controls/pickers.html和http://stackoverflow.com/questions/11754663/android-datepicker-fragment - 當用戶設置日期時如何做某事。這兩者之間有什麼問題? – BLaZuRE

+0

感謝您的回答。這些沒有錯。你的回答使我重新思考我的整個代碼,並將其刪除。問題更深,我試圖解釋下面進一步發生的事情。 – aszel

回答

1

您應該將您的片段#1作爲Target添加到DatePickerFragment中。通過這種方式:

DatePickerFragment datePicker = new DatePickerFragment(); 
datePicker.setTargetFragment(WhateverClassFragment1Is.this, 0); 

,然後在DatePickerDialog代碼:

OnDateSetListener ondate = new OnDateSetListener() { 
@Override 
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
    Log.i(TAG, text); 
    WhateverClassFragment1Is target = (WhateverClassFragment1Is) getTargetFragment(); 
    target.yourHandyMethod(dayOfMonth, monthOfYear, year); 
} 

};

希望有幫助!

相關問題