Cách sử dụng interface trong android

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 ViewModel

1.1 Chia sẻ tài liệu thân fragment với activity

Trong một vài trường hòa hợp bạn có thể bắt buộc share tài liệu giữa những fragment với activity nhưng bọn chúng được add vào. lấy ví dụ như bạn cũng có thể mong muốn biến hóa một phần UI phổ biến ngơi nghỉ activity dựa vào một liên can người tiêu dùng ở 1 fragment. lấy ví dụ ItemViewModel :

class 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

1.2 Chia sẻ tài liệu thân fragment cùng với nhau

Hai xuất xắc nhiều fragment vào và một Activity hay sẽ có được trường vừa lòng đề nghị giao tiếp cùng nhau. Ngoài phương pháp sử dụng interface nhằm tiếp xúc thân các fragment thì ví dụ tiếp sau đây cho thấy giải pháp 2 fragment hoàn toàn có thể thực hiện ViewModel nhằm tiếp xúc với nhau.class ListViewModel : ViewModel() val filters = MutableLiveDataSetFilter>>() private val originalList: LiveDataListItem>>() = ... val filteredList: LiveDataListItem>> = ...

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.

1.3 Chia sẻ tài liệu giữa parent fragment với child fragment

khi thao tác làm việc với các child fragment, parent fragmnent của người sử dụng với child fragment của chính nó có thể đề nghị share dữ liệu cùng nhau. Để share dữ liệu thân những child fragment này, hãy thực hiện parent fragment có tác dụng phạm vi của ViewModel.class ListFragment: Fragment() private val viewModel: ListViewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) viewModel.filteredList.observe(viewLifecycleOwner, ObVPS danh mục -> class ChildFragment: Fragment() private val viewModel: ListViewModel by viewModels(requireParentFragment())

1.4 Phạm vi một ViewModel Khi thực hiện Navigation Graph

Nếu các bạn sử dụng thỏng viện Navigation, bạn có thể điều chỉnh ViewModel trong vòng đời của NavBackStackEntry của điểm đến chọn lựa. Ví dụ ViewModel có thể được đưa vào NavBackStackEntry cho ListFragment nhỏng sau:class ListFragment: Fragment() private val viewModel: ListViewModel by navGraphViewModels(R.id.list_fragment) override fun onViewCreated(view: View, savedInstanceState: Bundle?) viewModel.filteredList.observe(viewLifecycleOwner, Obhệ thống chiến thắng -> 2. Nhận hiệu quả bằng Fragment Result API

2.1 Chuyển dữ liệu thân những fragment

Để chuyển tài liệu từ fragment B qua fragment A. Thứ nhất cài đặt một listener nhằm lắng nghe công dụng bên fragment A - fragment A dùng làm nhấn tác dụng. Hotline setFragmentResultListener() bên trên FragmentManager của fragment A, Ví dụ:override fun onCreate(savedInstanceState: Bundle?) super.onCreate(savedInstanceState) setFragmentResultListener("requestKey") requestKey, bundle -> val result = bundle.getString("bundleKey") Sơ vật dụng Fragment B gửi tài liệu tới Fragment A bởi FragmentManager
*

Trong Fragment B - fragment gửi dữ liệu. Quý Khách buộc phải gửi kết quả đi bên trên cùng một FragmentManagerbằng cách sử dụng và một requestKey. quý khách hàng rất có thể làm cho điều đó bằng cách áp dụng setFragmentRessult()

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.

2.2 Chuyển tài liệu thân parent fragment cùng child fragment

Để đưa một công dụng tự child fragment đến parent fragment, parent fragment cần áp dụng getChildFragmentManager() cố kỉnh bởi getParentFragmentManager() Khi Gọi setFragmentResultListener()override fun onCreate(savedInstanceState: Bundle?) super.onCreate(savedInstanceState) childFragmentManager.setFragmentResultListener("requestKey") key, bundle -> val result = bundle.getString("bundleKey") Sơ trang bị child fragment hoàn toàn có thể thực hiện FragmentManager nhằm gửi công dụng đến parent fragment
*

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

2.3 Nhận tác dụng làm việc Activity cất fragment

Để nhận kết quả gửi trường đoản cú fragment đến Activity, hãy đặt một listener để lắng nghe với áp dụng getSupportFragmentManager()class MainActivity : AppCompatActivity() override fun onCreate(savedInstanceState: Bundle?) super.onCreate(savedInstanceState) supportFragmentManager.setFragmentResultListener("requestKey", this) requestKey, bundle -> val result = bundle.getString("bundleKey") Kết luậnCó các cách để giao tiếp dữ liệu thân các fragment cùng nhau hoặc fragment với activity. quý khách đang sử dụng bí quyết làm sao, hãy vướng lại comment để cùng học hành cùng dàn xếp nhé.Bài viết bên trên là cá nhân tò mò cần có thể đúng, có thể không đúng, mong muốn được đầy đủ bạn góp ý.Cảm ơn rất nhiều bạn sẽ gọi bài xích của chính mình,