所以我正在学习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。