将数据传递到Android中的自定义视图

时间:2016-11-07 10:19:05

标签: java android

我对Android很新,我正在尝试创建一个自定义视图来显示饼图。我很熟悉Java并且之前在iOS / Swift中编写过饼图代码。

我的问题是,数据似乎没有按照我的预期传递,或者可能是在从超类以某种方式设置数据之前调用了onDraw函数。

我想知道传递要在onDraw函数中使用的数据的最佳方法。到目前为止,通过Android Custom View Constructor等帖子的一些帮助,我得到了以下代码:

public PieChart(Context _context) {
    this(_context, null);
}
public PieChart(Context _context, AttributeSet _attrs) {
    this(_context, _attrs, null);
}
public PieChart(Context _context, AttributeSet _attrs, ArrayList<ChartData> _data) {
    super(_context, _attrs);
    if(this.isInEditMode()) {
        data = new ArrayList<ChartData>();
        data.add(new ChartData("Column A", 50));
        data.add(new ChartData("Column B", 75));
        data.add(new ChartData("Column C", 60));
    } else {
        data = _data;
    }
    context = _context;
    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL);
    pieRectangle = new RectF(0,0,0,0);
    ...
}

从我的活动中调用的是:

// create the chart
PieChart pieChart = new PieChart(this, null, categoriesChartData);
// add the chart to the linearLayout
linearLayout.addView(pieChart);

我的PieChart.onDraw就是这样开始的:

protected void onDraw(Canvas canvasChart) {
    Log.d(TAG, "Size of data = " + data.size()); // crashes here
    ...
}

请注意,在界面设计器中,饼图看起来很棒,所以我知道onDraw方法有效,只是数据在运行应用程序时不会出现。

我没有添加额外的功能和电话,因为我在Android上没有很多经验,我想问一下社区问题是什么以及最好的方法是什么。

非常感谢提前!

3 个答案:

答案 0 :(得分:2)

由于您提到了界面设计器,我假设您还将视图添加到XML布局中。在这种情况下,Android View框架将使用此构造函数(按照惯例):

public PieChart(Context _context, AttributeSet _attrs)

这就是您datanull的原因。对于视图,您必须为数据创建一个setter方法,而不是将其作为构造函数参数传递。

此外,如果您已经在XML布局中声明了视图,则无需手动创建它 - 这只会将另一个视图添加到布局中。

答案 1 :(得分:1)

因为使用构造函数不是理想的;您可以构建一个接受数据数组的方法,在您的情况下,它是ArrayList<CharData>List<CharData>

public PieChart(Context _context) {
    this(_context, null);
}
public PieChart(Context _context, AttributeSet _attrs) {
    super(_context, _attrs);
    if(this.isInEditMode()) {
        data = new ArrayList<ChartData>();
        data.add(new ChartData("Column A", 50));
        data.add(new ChartData("Column B", 75));
        data.add(new ChartData("Column C", 60));
    }

    context = _context;
    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL);
    pieRectangle = new RectF(0,0,0,0);
    ...
}

protected void onDraw(Canvas canvasChart) {
    if(data != null){
       Log.d(TAG, "Size of data = " + data.size());
       // more codes here
    }
}

public void setValues(List<CharData> d){
   data = d;
}

最终用例如下:

PieChart pieChart = new PieChart(this, null);
linearLayout.setValues(categoriesChartData);
linearLayout.addView(pieChart);

答案 2 :(得分:-1)

我认为data为空,因为this.isInEditMode()返回false。您应该先检查它。