على Android ، يمكن نقل البيانات بين الأجزاء بطرق مختلفة: النقل من خلال النشاط الأصلي باستخدام ViewModel أو حتى Fragments API. تلقت Fragment Target API مؤخرًا حالة الإيقاف وتوصي Google باستخدام Fragment result API بدلاً من ذلك .
ما هي نتيجة Fragment API؟ هذه أداة جديدة من Google تتيح لك نقل البيانات بين الأجزاء باستخدام مفتاح. لهذا ، يتم استخدام FragmentManager ، والذي بدوره يقوم بتنفيذ واجهة FragmentResultOwner. يعمل FragmentResultOwner كمستودع مركزي للبيانات التي نمررها بين الأجزاء.
كيف تعمل؟
كما ذكرنا سابقًا ، يقوم FragmentManager بتنفيذ واجهة FragmentResultOwner التي يخزنها ConcurrentHashMap<String, Bundle>. يخزن HashMap هذا حزمنا عن طريق مفتاح السلسلة. بمجرد توقيع أحد الأجزاء (أو تم توقيعه بالفعل) ، فإنه يتلقى النتيجة لنفس المفتاح.
ما هو المهم أن تعرف :
- -
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. , , , . , , , , .
لكي نتمكن من استخدام FragmentResultListener ، نحتاج إلى تضمين إصدار الأجزاء 1.3.0-alpha04 أو الأحدث في التبعيات :
- إصدار جافا: androidx.fragment: fragment: 1.3.0-alpha04
- إصدار Kotlin: androidx.fragment: fragment-ktx: 1.3.0-alpha04
- الاختبارات: androidx.fragment: اختبار التجزئة: 1.3.0-alpha04