Androidフラグメント結果リスナー





Androidでは、フラグメント間のデータ転送はさまざまな方法で実行できます。ViewModelまたはFragmentsAPIを使用して親アクティビティを介して転送します。Fragment Target APIは最近非推奨ステータスを受け取りました代わりに、Fragment resultAPIを使用することをお勧めします



フラグメント結果APIとは何ですか?これは、キーを使用してフラグメント間でデータを転送できるGoogleの新しいツールです。このために、FragmentManagerが使用され、FragmentResultOwnerインターフェイスが実装されます。FragmentResultOwnerは、フラグメント間で渡すデータの中央リポジトリとして機能します。



使い方?



画像

上記のように、FragmentManagerはFragmentResultOwnerインターフェイスを実装し、これを格納しConcurrentHashMap<String, Bundle>ます。このHashMapは、バンドルを文字列キーで保存します。フラグメントの1つが署名される(またはすでに署名されている)とすぐに、同じキーの結果を受け取ります。



知っておくべき重要なこと



  • - setResultFragmentListener() , setFragmentResult(),
  • “Key + Result (Bundle)“ 1
  • STARTED
  • DESTROYED ResultListener


?





:



FragmentManager.setFragmentResult(key: String, bundle: Bundle)


, Bundle. Bundle .



Kotlin



button.setOnClickListener {
    val result = "result"
    //     Kotlin    fragment-ktx
    setFragmentResult("requestKey", bundleOf("bundleKey" to result))
}


Java



button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Bundle result = new Bundle();
        result.putString("bundleKey", "result");
        getParentFragmentManager().setFragmentResult("requestKey", result);
    }
});




FragmentManager FragmentResultListener . FragmentManager.setFragmentResult()



Kotlin



override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
     //     Kotlin  
    setFragmentResultListener("requestKey") { key, bundle ->
        //     ,  Bundle-
        val result = bundle.getString("bundleKey")
    }
}


Java



@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getParentFragmentManager().setFragmentResultListener("key", this, new FragmentResultListener() {
        @Override
        public void onFragmentResult(@NonNull String key, @NonNull Bundle bundle) {
            String result = bundle.getString("bundleKey");
        }
    });
}


2 : key: String bundle: Bundle.

— , . — Bundle, .



Parent Fragment Manger



画像


FragmentManager- :



  • FragmentManager ( Activity), FragmentManager, Activity
  • , childFragmentManager ( )


, FragmentResultListener FragmentManager-.





/ FragmentResultListener, FragmentScenario API, .





, FragmentManager? , FragmentResultListener :



@Test
fun testFragmentResult() {
    val scenario = launchFragmentInContainer<ResultFragment>()
    lateinit var actualResult: String?
    scenario.onFragment { fragment ->
        fragment.parentFragmentManagager.setResultListener("requestKey") { key, bundle ->
            actualResult = bundle.getString("bundleKey")
        }
    }
    onView(withId(R.id.result_button)).perform(click())
    assertThat(actualResult).isEqualTo("result")
}

class ResultFragment : Fragment(R.layout.fragment_result) {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        view.findViewById(R.id.result_button).setOnClickListener {
            val result = "result"
            setResult("requestKey", bundleOf("bundleKey" to result))
        }
    }
}




, FragmentManager. FragmentResultListener .



@Test
fun testFragmentResultListener() {
    val scenario = launchFragmentInContainer<ResultListenerFragment>()
    scenario.onFragment { fragment ->
        val expectedResult = "result"
        fragment.parentFragmentManagager.setResult("requestKey", bundleOf("bundleKey" to expectedResult))
        assertThat(fragment.result).isEqualTo(expectedResult)
    }
}

class ResultListenerFragment : Fragment() {
    var result : String? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setResultListener("requestKey") { key, bundle ->
            result = bundle.getString("bundleKey")
        }
    }
}




FragmentResultListener ,  Google. , , , . , , , , .



FragmentResultListenerを使用できるようにするには、依存関係にフラグメント1.3.0-alpha04以降のバージョンを含める必要があります



  • Javaバージョン:androidx.fragment:フラグメント:1.3.0-alpha04
  • Kotlinバージョン:androidx.fragment:fragment-ktx:1.3.0-alpha04
  • テスト:androidx.fragment:フラグメントテスト:1.3.0-alpha04



All Articles