我搜索过“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应该在Dialog中发送日期应该被发送回调用函数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的任何想法?
答案 0 :(得分:0)
我没有您引用的图书,因此我无法以原始形式查看示例,但我必须说它们看起来相当令人困惑。
setTargetFragment()
的文档说明了这一点:
例如,如果这个片段是由另一个片段启动的话,可以使用它,并且当完成时想要将结果返回给第一个片段。
因此,要有效地使用此方法,您必须拥有两个片段(&#34; target&#34;以及将结果传递给目标的内容)。在任何情况下,如果您有两个片段,并且您希望一个片段能够向另一个片段发送消息,理论上您可以使用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
内(而不是浮动对话框)的情况下,没有第二个片段成为&#34;目标&# 34;,所以setTargetFragment()
是非感性的。