2017-10-20 55 views
0

我搜索 “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没有设置的任何想法?

回答

0

我没有你参考的书,所以我不能看他们的原始形式的例子,但我不得不说,他们似乎相当混乱。

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()是无意义的。

+0

Ben P.,我认为你已经发现了这个问题,DatePickerFragment被托管在一个Activity中,它阻止它能够直接响应初始调用片段。所以,我回到了Android开发者指南重读https://developer.android.com/training/basics/fragments/communicating.html,并认为我需要通过创建Fragment的Activity来回应。 – Jeff