web-dev-qa-db-ja.com

MVVM-Googleマップを実装し、ViewModelにコンテキストを設定しますか?

だから私はMVVMを学び、それを愛しています。

しかし..これまでの私の問題は次のとおりです。

  • MVVMを使用したGoogleマップの実装。 (アクティビティまたはビューモデルで実行しますか?アクティビティでのみ実装できました。)

  • 特にCONTEXT ..以下のように渡しても大丈夫ですか?

私はこのライブラリを使用しています。

これは私のViewModelです:

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

DashboardActivity内に実装した現在の場所を取得するメソッドと通信する必要があります。

ViewModel内でマップを機能させるためにロジックを移行する必要がありますか?

私はここで少し迷っています。

9
Rosenberg

MVVMのSupportMapFragmentで同じ問題に直面していました。暫定的な解決策として、SupportMapFragmentの代わりにmapviewを使用しました。

まず、CustomBindingで1つのメソッドを作成する必要があります。

@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}" />

そして、viewmodelクラス内では、1つのオブザーバーフィールドを取る必要があります

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

したがって、上記のオブザーバー変数(mMapLatLng)で現在の場所を設定すると、OnMapReadyCallbackが呼び出されます。

6
Harsh Trivedi