2017-05-15 7 views
1

Ich habe die android data binding with a custom view Erklärung gefunden, aber das funktioniert nicht für mich, weil ich das nicht sehr gut verstehe und auch ich habe ein bisschen anders Fall.Implementierung benutzerdefinierte Ansicht mit MVVM

Meine Idee: Ich brauche Leinwand, damit ich etwas darauf zeichnen kann. Ich habe eine Klasse (CustomView) erstellt, die die View-Klasse erweitert. In CustomView-Klasse habe ich Instanz des Dienstes erstellt, der für das Zeichnen verantwortlich ist, und in der überschriebenen onDraw-Methode habe ich Canvas an Service-Klasse übergeben, damit die App zeichnen kann.

Das Problem: In Tätigkeit habe ich setContentView(new CustomView()); verwendet, aber das wird nicht funktionieren, wenn ich MVVM-Entwurfsmuster verwenden möchten. Wie kann ich das trennen und es mit der MVVM-Datenbindung arbeiten lassen? Ich verstehe nicht, wie und wo CustomView eingerichtet wird, so dass es von Ansicht mit Datenbindung abgerufen werden kann?

Bitte ertragen Sie mit mir, ich bin neu bei Android und habe nicht genug Erfahrung. Thanks :)

Antwort

3

Ich schlage vor, diese Lösung:

Activity.java

package com.example.myapplication; 

import android.databinding.DataBindingUtil; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import com.example.myapplication.databinding.ActivityBinding; 

import java.util.Arrays; 

public class Activity extends AppCompatActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     //Do magic with binding 
     ActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity); 
     CustomViewModel viewModel = new CustomViewModel(); 
     binding.setVariable(BR.vm, viewModel); 
     binding.executePendingBindings(); 

     //Fill model 
     viewModel.backgroundFill.set(Color.WHITE); 
     viewModel.setCircleModels(Arrays.asList(new CircleModel(0, 0), new CircleModel(200, 400))); 
    } 
} 

CustomView.java

package com.example.myapplication; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.support.annotation.ColorInt; 
import android.support.annotation.Nullable; 
import android.util.AttributeSet; 
import android.view.View; 

import java.util.Collections; 
import java.util.List; 

public class CustomView extends View 
{ 
    private Paint mPaint = new Paint(); 
    private int backgroundFill; 
    private List<CircleModel> circleModels = Collections.emptyList(); 

    public CustomView(Context context, @Nullable AttributeSet attrs) 
    { 
     super(context, attrs); 

     mPaint.setStyle(Paint.Style.FILL); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     super.onDraw(canvas); 

     mPaint.setColor(backgroundFill); 
     canvas.drawPaint(mPaint); 

     mPaint.setColor(Color.BLUE); 
     for(CircleModel model : circleModels) 
      canvas.drawCircle(model.getX(), model.getY(), 100, mPaint); 
    } 

    public void setBackgroundFill(@ColorInt int backgroundFill) 
    { 
     this.backgroundFill = backgroundFill; 
    } 

    public void setCircles(List<CircleModel> circles) 
    { 
     circleModels = circles; 
    } 
} 

CustomViewModel.java

package com.example.myapplication; 

import android.databinding.BaseObservable; 
import android.databinding.Bindable; 
import android.databinding.ObservableInt; 

import java.util.ArrayList; 
import java.util.List; 

public class CustomViewModel extends BaseObservable 
{ 
    public final ObservableInt backgroundFill = new ObservableInt(); 
    @Bindable 
    private List<CircleModel> circleModels = new ArrayList<>(); 

    public List<CircleModel> getCircleModels() 
    { 
     return circleModels; 
    } 

    public void setCircleModels(List<CircleModel> circleModels) 
    { 
     this.circleModels = circleModels; 
     notifyPropertyChanged(BR.circleModels); 
    } 
} 

CircleModel.java

public class CircleModel 
{ 
    private int x; 
    private int y; 

    public CircleModel(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public int getX() { return x; } 

    public int getY() { return y; } 
} 

activity.xml

<?xml version="1.0" encoding="utf-8"?> 
    <layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <data> 

     <variable 
      name="vm" 
      type="com.example.myapplication.CustomViewModel" /> 
    </data> 

    <android.support.design.widget.CoordinatorLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <com.example.myapplication.CustomView 
      android:id="@+id/canvas" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:backgroundFill="@{vm.backgroundFill}" 
      app:circles="@{vm.circleModels}"/> 
      <!--Setters in CustomView--> 
      <!--app:backgroundFill="@{vm.backgroundFill}"--> 
      <!--app:circles="@{vm.circleModels}"--> 

    </android.support.design.widget.CoordinatorLayout> 
</layout> 

Kontakt mit mir benötigen, wenn alle Projekt

+0

Привет! Danke, ich werde diese Lösung versuchen und Ihnen das Ergebnis mitteilen. – hogar

+0

Hallo Виталий, kannst du mir bitte git Repo für das ganze Projekt geben, wäre es sehr hilfreich? Können Sie mir auch sagen, ob es in Ordnung ist, instantiierte Objekte einiger Zeichnungsdienste in der CustomView-Klasse zu haben? Danke – hogar

+1

Hallo, Hogar, Link auf Projekt: https://github.com/Arigar/AndroidMVVMExample.git. Ich verstehe die Frage nach "instanziierten Objekten einiger Zeichnungsdienste" nicht. Meinst du [Android Service] (https://developer.android.com/guide/components/services.html), oder etwas anderes? –

Verwandte Themen