Pemroses Hasil Fragmen Android





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?



gambar

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
  • 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



gambar


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



All Articles