Android:另一个Fragment调用的Fragment中的DatePickerDialog-发送数据



我有一个片段,它调用另一个片段(DialogFragment)。我知道这不是最好的做法,这就是为什么我要问。

在片段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动态附加到<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);
}

就这样。谢谢你的帮助。根据文件规定,应避免直接的碎片对碎片通信。

您应该将您的片段#1添加到DatePickerFragment中作为Target。这样:

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);
}

};

希望能有所帮助!

最新更新