2017-05-15 109 views
1

我找到了android data binding with a custom view解释,但这对我不起作用,因为我不太了解这一点,而且我有一点不同的情况。使用MVVM实现自定义视图

我的想法: 我需要画布,所以我可以画一些东西。 我做了一个扩展View类的类(CustomView)。在CustomView类中,我制作了负责绘制的服务实例,并且在重写的onDraw方法中,我将canvas传递给了服务类,以便应用程序可以绘制。

问题: 在活动我都用过setContentView(new CustomView());,但如果我想使用MVVM设计模式,这是不行的。 我该如何区分这一点,并使其与MVVM数据绑定一起工作? 我不明白如何以及在哪里设置CustomView,以便可以通过数据绑定查看。

请耐心等待,我是Android新手,没有足够的经验。 谢谢:)

回答

3

我提出这个解决方案:

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> 

与我联系,如果需要的所有项目

+0

Привет!谢谢,我会尝试这个解决方案并让你知道结果。 – hogar

+0

你好Виталий,你可以给我整个项目的git回购,这会非常有帮助吗?另外,你能告诉我可以在CustomView类中实现一些绘图服务的实例化对象吗? 谢谢 – hogar

+1

嗨,Hogar,项目链接:https://github.com/Arigar/AndroidMVVMExample.git。我不理解关于“某些绘图服务的实例化对象”的问题。你的意思是[android服务](https://developer.android.com/guide/components/services.html),还是别的? –