我想制作一个包含五个不同片段的应用程序。在每个片段中,我都需要设备的GPS位置,但目的会有所不同。
为了不为每个片段实现FusedLocationProviderClient五次,我想在MainActivity中这样做一次并将结果发送到显示的片段。
作为java编程的初学者,我请求您的指导。如何确定设备的GPS位置以及位置自动发送(在每次更新时)到活动片段?
也许是服务之类的东西?任何示例代码都是受欢迎的。提前感谢!
使用ViewModel
有一个简单的解决方案。
这个概念是你初始化一个状态持有者,并在你的片段中共享这个持有者的相同实例。
这个holder的实例存储在你的activity中。
你的ViewModel可能看起来像这样
public class MyViewModel extends ViewModel {
private MutableLiveData<LatLng> location = new MutableLiveData<LatLng>();
public LiveData<LatLng> getLocation() {
return location;
}
private void setLocation(LatLng value) {
location.setValue(value)
}
}
在你的活动中得到这个viewModel的实例。我们为此使用了ViewModelProvider工厂。
private MyViewModel model;
//in your activity onCreate
model = new ViewModelProvider(this).get(MyViewModel.class);
//and from location callback
model.setLocation(latlng)
在你所有的片段中,你可以观察到这些数据
//first get the same instance of your ViewModel onViewCreated
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getLocation().observe(getViewLifecycleOwner(), item -> {
// Update the UI.
//will execture everytime new data is set
});
在你的应用程序中包含所需的依赖项build.gradle
dependencies {
def lifecycle_version = "2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
}
在这里了解更多关于ViewModel
的信息