Di Android, mentransfer data antar fragmen dapat dilakukan dengan berbagai cara: mentransfer melalui Aktivitas induk menggunakan ViewModel atau bahkan Fragments API. Fragment Target API baru-baru ini menerima status Deprecated dan Google merekomendasikan penggunaan Fragment result API sebagai gantinya .
Apa itu API hasil Fragmen? Ini adalah alat baru dari Google yang memungkinkan Anda mentransfer data antar fragmen menggunakan kunci. Untuk ini, FragmentManager digunakan, yang kemudian mengimplementasikan antarmuka FragmentResultOwner. FragmentResultOwner bertindak sebagai repositori pusat untuk data yang kami teruskan di antara fragmen.
Bagaimana itu bekerja?
Seperti disebutkan di atas, FragmentManager kami mengimplementasikan antarmuka FragmentResultOwner, yang disimpannya ConcurrentHashMap<String, Bundle>. HashMap ini menyimpan Bundel kami dengan kunci string. Segera setelah salah satu fragmen ditandatangani (atau sudah ditandatangani), maka ia menerima hasil untuk kunci yang sama.
Yang penting untuk diketahui :
- -
setResultFragmentListener(),setFragmentResult(), - βKey + Result (Bundle)β 1
-
STARTED -
DESTROYEDResultListener
?
:
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. , , , . , , , , .
Agar dapat menggunakan FragmentResultListener, kita perlu menyertakan versi fragmen 1.3.0-alpha04 atau yang lebih baru dalam dependensi :
- Versi Java: androidx.fragment: fragment: 1.3.0-alpha04
- Versi Kotlin: androidx.fragment: fragment-ktx: 1.3.0-alpha04
- Pengujian: androidx.fragment: fragment-testing: 1.3.0-alpha04