web-dev-qa-db-ja.com

Android-getTargetFragmentおよびsetTargetFragment-使用目的

検索してみましたが、まだ少し迷っています。私は通常、インターフェースを介してActivityまたはBroadcastReceiverを介して通信をフラグメント化しています。

とにかく、私の質問はgetTargetFragmentの使用は何ですか?使用例を理解できるように、誰かがユースケースまたは簡単な例を提供できますか?

34
j2emanue

ユースケース=同じアクティビティでホストされている2つのフラグメント。

startActivityForResult()は2つのアクティビティ間の関係を確立し、setTargetFragment()は2つのフラグメント間の呼び出し元/呼び出された関係を定義します。

setTargetFragment(target)は、「呼び出された」フラグメントに結果の送信先を知らせます。この場合、onActivityResult()は手動で呼び出されます。

public class Caller extends Fragment
     Fragment called = Called.newInstance()
     called.setTargetFragment(this)

public class Called extends DialogFragment
   intent = amazingData
   getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent)
43
kandinski

フラグメントでsetTargetを使用する方法をようやく見つけて、共有したいと思いました。フラグメント間で通信する場合に非常に便利です。

以下に例を示します。ダイアログを表示したい場合、ダイアログが閉じたときに何らかのアクションを実行したいとします。

したがって、ダイアログを使用するfragment1では、これを行うことができます:

myDialogFragment.setTargetFragment(fragment1, myDialogFragment.REQ_CODE);

そして、ダイアログを呼び出したフラグメントでは、次のようにonActivityResultをオーバーライドする必要があります。

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == CoDDialogFragment.REQ_CODE)
            exit(); //or whatever you want to do here
    }

myDialogFragmentでこれを行うことができます:

TellTargetYouGotResults(REQ_CODE);

//...
  private void TellTargetYouGotResults(int code) {
        Fragment targetFragment = getTargetFragment(); // fragment1 in our case
        if (targetFragment != null) {
            targetFragment.onActivityResult(getTargetRequestCode(), code, null);
        }
    }

rEQ_CODEは、もちろん任意のintになります。フラグメント間通信に非常に役立ちます。ただし、ターゲットにデータを送信した後、そのビューが既に破壊されている可能性があるため(フラグメントの場合)、イベントバスを好むため、onActivityResultでビューを更新しようとするとクラッシュします。だから私は、データを渡すだけで、UIを更新しないで、「ビューを破壊するが状態を維持する」置換ではなく「追加」フラグメントトランザクションを実行しないと便利だと思います。

10
j2emanue

私がドキュメントを読むことから奪うことができたのは、これらのメソッドが別のフラグメントのデータにアクセスする別の方法であるということでした。これらは、これらのメソッドを使用するための単一のユースケースを示す サンプルプロジェクト です。しかし、もっと多くのユースケースがあると確信しています...

4
Alex Fu