无法设置setTargetFragment来引用调用代码

时间:2017-10-20 21:57:44

标签: java android android-fragments dialog

我搜索过“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的任何想法?

1 个答案:

答案 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()是非感性的。