簡體   English   中英

將數據傳遞到Android中的自定義視圖

[英]Passing data to custom view in 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方面沒有很多經驗,而是想向社區詢問問題出在哪里以及最好的方法是什么。

提前謝謝了!

既然您提到了界面設計器,那么我假設您還將視圖添加到了XML布局中。 在這種情況下,Android View框架將使用此構造函數(按照慣例):

public PieChart(Context _context, AttributeSet _attrs)

這就是您的datanull的原因。 對於視圖,您必須為數據創建一個setter方法,而不是將其作為構造函數參數傳遞。

此外,如果您已經在XML布局中聲明了視圖,則無需手動創建它-這只會在布局中添加另一個視圖。

由於使用構造函數不是理想的方法; 您可以構建一個接受數據數組的方法,在您的情況下為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);

我認為data為null,因為this.isInEditMode()返回false。您應該先檢查它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM