2017-10-20 11 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 Programming"を見ており、フラグメント間の通信についての質問があります。具体的には、第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に送り返されることになっているダイアログで日付を送信することになっているが、それは着呼ためではありません

  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が設定されていないことを示しています:G断片は以下DatePickerFragmentからコードに見られるようにgetTargetFragment == null、設定されていない

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.

、効果的にこの方法を使用するには、の断片(「ターゲット」とターゲットに結果をお届けします何かを)持っている必要があります。いずれにしても2つのフラグメントがあり、メッセージを別のフラグメントに送信できるようにするには、理論的にはsetTargetFragment()を使用してください。それがベストプラクティスであるかどうかは、別の議論です。

あなたが書くしようとしたコードに関しては:

DatePickerFragment fragment = DatePickerFragment.newInstance(date); 
fragment.setTargetFragment(CrimeFragment, REQUEST_DATE); 
return fragment; 
Error:(29, 36) error: cannot find symbol variable CrimeFragment 

書かれたとして、あなたはfragment.setTargetFragment()を呼び出すときに、範囲内CrimeFragmentという名前のいくつかの変数が存在しなければなりません。存在しないので、コンパイラはこのエラーを表示します。DatePickerFragmentが(フローティングダイアログであるとは対照的に)Activity内に直接ホストされている状況では

は、「標的」すべき第2の断片はありませんので、setTargetFragment()は無意味です。

+0

Ben P.私はあなたが問題を特定したと思います。アクティビティ内でホストされているDatePickerFragmentは、それが最初の呼び出し元フラグメントに直接応答できないようにします。そこで、Androidデベロッパーガイドに戻り、https://developer.android.com/training/basics/fragments/communicating.htmlを再度読んで、そのFragmentを作成したアクティビティから返信する必要があると思います。 – Jeff

関連する問題