Xin xin chào độc giả, chào mừng các bạn mang đến với bài xích share của bản thân mình. Chủ đề thiết yếu ngày hôm nay: "Giao tiếp thân những fragment ko sử dụng interface". Trong quá trình học cùng thao tác với Android thì chắc rằng trong số chúng ta ai ai cũng vẫn và đang gặp gỡ phải ngôi trường đúng theo truyền dữ liệu thân fragment với fragmnet hoặc fragment với activity. Ngoài phương pháp truyền thống lịch sử như thể áp dụng interface hoặc broadcast receiver thì Android còn hỗ trợ lập trình sẵn viên một trong những biện pháp truyền dữ liệu thân các fragment như là : Sử dụng ViewModel với Fragment Result API. Hôm nay họ cùng mày mò về các bí quyết này nhé. Let"s go !!!
1. Chia sẻ tài liệu thực hiện ViewModelclass ItemViewModel : ViewModel() private val mutableSelectedItem = MutableLiveDataItem>() val selectedItem: LiveDataItem> get() = mutableSelectedItem fun selectItem(item: Item) mutableSelectedItem.value = công trình Fragment của chúng ta cùng Activity phần đa truy cập cho cùng 1 instance của ViewModel (thuộc phạm vi vận động - phạm vi hoạt động vui chơi của ViewModel được khởi chế tác bằng phương pháp truyền activity vào constructor của ViewModelProvider). ViewModelProvider xử lý vấn đề khởi chế tạo ViewModel hoặc truy nã xuất cho nó ví như nó đã trường thọ. Cả Fragment cùng Activity phần đông có thể quan liêu giáp cùng sửa đổi dữ liệu trong ViewModel :class MainActivity : AppCompatActivity() private val viewModel: ItemViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) super.onCreate(savedInstanceState) viewModel.selectedItem.observe(this, Obhệ thống chiến thắng -> ) class ListFragment : Fragment() private val viewModel: ItemViewModel by activityViewModels() fun onItemClicked(item: Item) viewModel.selectItem(item) Chú ý:
Tại sao bên trên bản thân nói : " truyền activity vào constructor của ViewModelProvider " thì theo cách khởi tạo ra ViewModel trước đây thì các bạn sẽ đề nghị làm cho nlỗi sau:val viewModel : ItemViewModel = ViewModelProvider(this).get(ItemViewModel.class)Đảm bảo sử dụng phạm vi ưng ý phù hợp với ViewModelProvider. Trong ví dụ bên trên, MainActivity được áp dụng làm phạm vi vào cả MainActivity cùng Fragment, vì chưng vậy cả hai hầu như hoàn toàn có thể sử dụng phổ biến được ItemViewModel. Nếu điều ấy trở lại thì quan yếu có tác dụng được.
Bạn đang xem: Cách sử dụng interface trong android
Xem thêm: Iphone 5 (16Gb, 32Gb, 64Gb) Cũ, Mới 99%, Giá Rẻ 06/2021 Toàn Quốc
fun addFilter(filter: Filter) ... fun removeFilter(filter: Filter) ... class ListFragment : Fragment() private val viewModel: ListViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) viewModel.filteredList.observe(viewLifecycleOwner, ObVPS danh sách -> class FilterFragment : Fragment() private val viewModel: ListViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) viewModel.filters.observe(viewLifecycleOwner, ObVPS set -> fun onFilterSelected(filter: Filter) = viewModel.addFilter(filter) fun onFilterDeselected(filter: Filter) = viewModel.removeFilter(filter)Chụ ý:Cả nhì fragment bên trên phần lớn áp dụng activity của bọn chúng làm phạm vi cho ViewModelProvider. Bởi bởi các fragment sử dụng cùng 1 phạm vi, bọn chúng thuộc nhận được một instance của ViewModel đang có thể chấp nhận được chúng giao tiếp hỗ tương.ViewModel vẫn còn trong bộ nhớ lưu trữ cho đến khiViewModelStoreOwner nhưng mà nó gồm phạm vi thực hiện mất tích lâu dài.button.setOnClickListener val result = "result" setFragmentResult("requestKey", bundleOf("bundleKey" to lớn result))Sau đó, fragment A cảm nhận kết quả cùng thực hiện listener callbachồng khi fragment được STARTED.Quý khách hàng chỉ hoàn toàn có thể gồm một listener tuyệt nhất với result cho một key nhất thiết. Nếu chúng ta điện thoại tư vấn setFragmentResult() nhiều hơn nữa 1 lần với cùng 1 key cùng nếu như listener ko STARTED. Hệ thống vẫn thay thế hầu hết tác dụng đã chờ xử lý bằng một hiệu quả cập nhật tiên tiến nhất của khách hàng.Nếu chúng ta gửi một result cơ mà không có listener tương ứng dấn nó, thì kết quả sẽ tiến hành tàng trữ vào FragmentManager cho đến khi chúng ta thiết đặt một listener với thông thường một key nhằm dìm nó.Lúc một listener nhận ra kết quả cùng kích hoạt callback onFragmentResult(), công dụng sẽ bị xóa. Hành vi này có nhì hàm ý chính:Các fragment bên trên ngăn xếp vùng sau không sở hữu và nhận được hiệu quả cho đến Khi bọn chúng được lộ diện và STARTED.Nếu một fragment đã lắng nghe một hiệu quả mà lại được STARTED lúc công dụng được tùy chỉnh cấu hình thì callbaông xã của listener sẽ tiến hành kích hoạt tức thì nhanh chóng.Crúc ý: Vì tác dụng fragment được lưu trữ sinh hoạt FragmentManager đề xuất fragment của doanh nghiệp phải được đi cùng để Điện thoại tư vấn setFragmentResultListener() hoặc setFragmentResult() cùng với FragmentManager của bọn chúng.
Child fragment gửi tác dụng thông qua FragmentManager của nó, Sau đó parent fragment vẫn nhận được kết quả lúc fragment STARTED
button.setOnClickListener val result = "result" setFragmentResult("requestKey", bundleOf("bundleKey" to result))