2017-10-20 173 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