を参照するsetTargetFragmentを設定することはできません私は "setTargetFragment" を検索しのような答えのための既存の投稿を読んだ:は、呼び出し元のコード
Communication between two fragments - which is right way?
Communicate between fragment and fragment dialog
Android - getTargetFragment and setTargetFragment - What are they used for
を私はBig Nerd Ranchの "Android Programming"を見ており、フラグメント間の通信についての質問があります。具体的には、第12章でDialogFragmentは、画面サイズに応じて、「犯罪」の日付をリセットするために使用されます。
public class CrimeFragment extends Fragment {
...
if (ScreenSize < 2080) {
DatePickerFragment dialog = DatePickerFragment
.newInstance(mCrime.getDate());
dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE);
dialog.show(manager, DIALOG_DATE);
} else {
date = mCrime.getDate();
id = mCrime.getId();
Intent intent = new Intent(getContext(), DatePickerActivity.class);
intent.putExtra(EXTRA_DATE, date);
startActivityForResult(intent, REQUEST_DATE);
}
DatePickerFragmentはDatePickerActivityで呼び出しから下に作成されます。
public class DatePickerActivity extends SingleFragmentActivity {
private final String TAG = "DatePickerActivity";
private static final int REQUEST_DATE = 0;
@Override
protected Fragment createFragment() {
Intent intent = getIntent();
Date date = (Date) intent.getSerializableExtra(CrimeFragment.EXTRA_DATE);
return DatePickerFragment.newInstance(date);
}
}
のnewInstance:
public class DatePickerFragment extends DialogFragment {
...
public static DatePickerFragment newInstance(Date date){
Bundle args = new Bundle();
args.putSerializable(EXTRA_DATE, date);
DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(args);
return fragment;
}
のonClickは、呼び出し元の関数CrimeFragmentに送り返されることになっているダイアログで日付を送信することになっているが、それは着呼ためではありません
public void onClick(View v) {
int year = mDatePicker.getYear();
int month = mDatePicker.getMonth();
int day = mDatePicker.getDayOfMonth();
Date date = new GregorianCalendar(year, month, day).getTime();
sendResult(Activity.RESULT_OK, date);
}
});
return v;
}
private void sendResult(int resultCode, Date date){
if(getTargetFragment() == null){
Log.d(TAG + "/sendResult", "getTargetFragment = null");
Log.d(TAG + "/sendResult", "getTargetFragment actual value: " + String.valueOf(getTargetFragment()));
return;
}
Log.d(TAG + "/sendResult", "getTargetFragment = " + String.valueOf(getTargetFragment()));
Intent intent = new Intent();
intent.putExtra(EXTRA_DATE, date);
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
}
LogCat出力getTargetFragmentが設定されていないことを示しています:G断片は以下DatePickerFragmentからコードに見られるようにgetTargetFragment == null
、設定されていない
DatePickerFragment/sendResult: getTargetFragment = null
DatePickerFragment/sendResult: getTargetFragment actual value: null
をだから、私は、設定を設定しようとしました次のようにDatePickerActivityの呼び出し音が鳴りますが、これは失敗します。
//return DatePickerFragment.newInstance(date);
DatePickerFragment fragment = DatePickerFragment
.newInstance(date);
fragment.setTargetFragment(CrimeFragment, REQUEST_DATE);
return fragment;
この結果、エラーが発生します。Error:(29, 36) error: cannot find symbol variable CrimeFragment
。
setTargetFragmentが設定されていない理由はありますか?
Ben P.私はあなたが問題を特定したと思います。アクティビティ内でホストされているDatePickerFragmentは、それが最初の呼び出し元フラグメントに直接応答できないようにします。そこで、Androidデベロッパーガイドに戻り、https://developer.android.com/training/basics/fragments/communicating.htmlを再度読んで、そのFragmentを作成したアクティビティから返信する必要があると思います。 – Jeff