我搜索 「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編程」,並對片段之間的通信提出疑問。具體而言,在第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,但它不是因爲呼入克片段沒有被設置,所以getTargetFragment == null
如代碼看到從DatePickerFragment下面:
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未設置:
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被託管在一個Activity中,它阻止它能夠直接響應初始調用片段。所以,我回到了Android開發者指南重讀https://developer.android.com/training/basics/fragments/communicating.html,並認爲我需要通過創建Fragment的Activity來回應。 – Jeff