2016-11-07 10 views
1

私はAndroidが新しく、カスタムチャートを作成して円グラフを表示しようとしています。私はJavaでOKですし、前に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のような始まりこの:インターフェイスデザイナーで、円グラフは偉大に見えるので、私はonDrawメソッドは動作します知っている、それはアプリが実行されたときにデータが存在し、それを作っていないことを単にだと

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

は注意してください。

余分な機能や呼び出しを追加するのではなく、私がAndroidで多くの経験をしていないので、私はそのコミュニティの問題点と最善のアプローチを教えてください。

事前に感謝します。

+0

ビューのために何を拡張していますか?なぜif(this.isInEditMode())ですか? –

+0

新しいカスタムコンストラクタを追加しないでください。セッターを追加する必要があります。 – EpicPandaForce

+0

エラーがあれば、logcatを投稿してください。 – Enzokie

答えて

1

、私はあなたにもXMLレイアウトにビューを追加することを前提としています。

public PieChart(Context _context, AttributeSet _attrs) 

あなたdatanullである理由である。その場合にはAndroidのビューフレームワークは(慣例により)このコンストラクタを使用します。ビューの場合、コンストラクタパラメータとして渡す代わりに、データのセッタメソッドを作成する必要があります。

さらに、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); 
+0

申し訳ありませんが、それはさらにダウンしました。これを反映するようにコードを更新しました。私が知る限り、これは問題ではありません。 – Ben

+1

@Ben答えを更新しました。 – Enzokie

-1

は、this.isInEditMode()が返されるので、最初に確認する必要があるためnullです。

関連する問題