2016-11-07 79 views
1

我对Android相当陌生,并试图创建自定义视图来显示饼图。我对Java很熟悉,并且之前已经在iOS/Swift中编写了饼图代码。将数据传递给Android中的自定义视图

我的问题是数据看起来并没有像我期望的那样通过,或者可能是在超类设置数据之前调用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经验,所以我想问问社区什么是问题,什么是最好的方法。

非常感谢提前!

+0

你对视图的延伸是什么?为什么if(this.isInEditMode())? –

+0

你不应该添加一个新的自定义构造函数。你应该添加一个setter。 – EpicPandaForce

+0

如果出现错误,请发布logcat。 – Enzokie

回答

1

既然你提到界面设计师,我认为你还添加了以XML布局。在这种情况下,Android设备上查看框架将使用这个构造器(按照约定):

public PieChart(Context _context, AttributeSet _attrs) 

这就是为什么你datanull的原因。对于视图,您必须为您的数据创建一个setter方法,而不是将其作为构造函数参数传递。此外,如果您已经在XML布局中声明了您的视图,则不需要手动创建它 - 这只会将另一个视图添加到布局中。

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); 
+0

中看到饼图对不起,它更进一步 - 我更新了我的代码以反映这一点。据我所知,这不是问题。 – Ben

+1

@Ben我更新了我的答案。 – Enzokie

-1

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

相关问题