MVVM - 实现谷歌地图并在ViewModel中拥有上下文?



所以我正在学习MVVM,喜欢它。

但是..到目前为止,我的问题如下:

  • 使用 MVVM 实现谷歌地图。(我是针对活动还是视图模型执行此操作?我只能在活动中实现它..(

  • 尤其是上下文..可以像下面这样传递吗?

我正在使用这个库。

这是我的观点模型:

public class DashboardViewModel implements ViewModel {
public final ObservableField<String> dashButton = new ObservableField<>("");
public final Action onRandomSearch;
private Context context;

public DashboardViewModel(Context context) {
this.context = context;
onRandomSearch = () -> {
String randomString = UUID.randomUUID().toString();
String randomQuery = randomString.substring(0, 3) + " " + randomString.substring(5, 8);
dashButton.set(randomQuery); //JUST TO TEST
};
}
}

这是我的活动:

public class DashboardActivity extends MvvmActivity {
@NonNull
@Override
protected ViewModel createViewModel() {
loadMap();
return new DashboardViewModel(this);
}
@Override
protected int getLayoutId() {
return R.layout.activity_dashboard;
}
private void loadMap() {
SupportMapFragment mapFragment =
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
startLocation();
...

现在,为了让谷歌地图在我的应用程序上运行,我必须实现OnMapReadyCallback,如下所示:

public class DashboardActivity extends MvvmActivity implements OnMapReadyCallback

我需要与获取当前位置的方法进行通信,我在仪表板活动中实现了该方法。

我是否应该迁移逻辑以使地图在视图模型中工作?

我在这里有点迷茫。

我在MVVM中遇到了同样的支持地图片段问题。 对于临时解决方案,我使用了mapview而不是SupportMapFragment。

首先,您需要在自定义绑定中创建一个方法。

@BindingAdapter("initMap")
public static void initMap(final MapView mapView, final LatLng latLng) {
if (mapView != null) {
mapView.onCreate(new Bundle());
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
// Add a marker
googleMap.addMarker(new MarkerOptions().position(latLng).title("Marker in India"));
}
});
}
}

xml文件的代码

<com.google.android.gms.maps.MapView
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="200dp"
app:initMap="@{viewmodel.mMapLatLngObservable}" />

在视图模型类中,您必须采用一个观察者字段

public ObservableField<LatLng>  mMapLatLng = new ObservableField<>();

因此,当您在上面的观察变量(mMapLatLng(中设置当前位置时,将调用您的OnMapReadyCallback。

最新更新