3

別のフラグメント (DialogFragment) を呼び出すフラグメントがあります。それがベストプラクティスではないことを知っているので、私は尋ねています。

フラグメント 1 では、日付ピッカー ダイアログ onClick をフラグメントとして提供する EditText を取得しました。

@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 要素に日付を取得するにはどうすればよいですか? 正しいビューではないため、リクエストしても正しい EditText 要素を見つけることができませんview.findViewById(R.id.editTextGeb);。ホスティング活動について連絡を取る必要はありますか? もしそうなら、どこかに良い例はありますか?

私は答えを見つけました。

私が実際に持っているのは、FrameLayout に動的にアタッチされるフラグメントです (私のプロジェクトではタブを使用しています)。したがって、ID で見つけることができず、親要素を呼び出さなければなりませんでした。ここで問題を理解するのに何が役立ったかについての良い説明があります: <FrameLayout> に動的にアタッチされたフラグメントを取得しますか?

Google が提供する 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);
}

それでおしまい。助けてくれてありがとう。ドキュメントによると、フラグメントからフラグメントへの直接通信は避けるべきです。

4

1 に答える 1

1

フラグメント #1 をターゲットとして 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);
}

};

それが役立つことを願っています!

于 2013-07-25T08:03:01.947 に答える