无法设置setTargetFragment引用调用代码
我搜索 “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没有设置的任何想法?
我没有你参考的书,所以我不能看他们的原始形式的例子,但我不得不说,他们似乎相当混乱。
为setTargetFragment()
文档说这个:
This may be used, for example, if this fragment is being started by another, and when done wants to give a result back to the first.
因此,要有效地使用这种方法,你必须有片段(“目标”和东西,这将提供结果的目标)。在任何情况下,如果您有两个片段,并且您希望能够将消息发送给另一个,则理论上可以使用setTargetFragment()
来完成此操作。不管这是否是最佳做法,都是一个不同的讨论。
至于你的代码已经试着写:
DatePickerFragment fragment = DatePickerFragment.newInstance(date);
fragment.setTargetFragment(CrimeFragment, REQUEST_DATE);
return fragment;
Error:(29, 36) error: cannot find symbol variable CrimeFragment
书面,必须有一些变量命名CrimeFragment
范围内,当你调用fragment.setTargetFragment()
。没有,所以编译器显示这个错误。
在其中DatePickerFragment
直接托管的Activity
内部(而不是作为一个浮动对话框)的情况下,也没有成为“目标”第二片段,所以setTargetFragment()
是无意义的。
Ben P.,我认为你已经发现了这个问题,DatePickerFragment被托管在一个Activity中,它阻止它能够直接响应初始调用片段。所以,我回到了Android开发者指南重读https://developer.android.com/training/basics/fragments/communicating.html,并认为我需要通过创建Fragment的Activity来回应。 – Jeff