android-fragments 在多个片段上使用相同的GPS位置代码

qgelzfjb  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(155)

我想做一个应用程序,将包括五个不同的片段。在每个片段中,我需要设备的GPS位置,但目的将有所不同。
为了避免为每个片段实现五次FusedLocationProviderClient,我考虑在MainActivity中执行一次,然后将结果发送到显示的片段。
作为一个java编程的初学者,我向你寻求指导。我如何确定设备的GPS位置,并且位置自动发送(在每次更新时)到活动片段?
也许像一个服务的东西?任何样本代码将是受欢迎的。提前感谢!

busg9geu

busg9geu1#

对于这个问题,有一个简单的解决方案,使用ViewModel
其概念是初始化一个状态保持器,并在片段之间共享该持有者的同一个示例。
该保持器的示例存储在您的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)
    }
}

在您的Activity中获取该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的更多信息

相关问题