2014-09-10 36 views
1

我需要在我的Activity上创建一些PieCharts,并且图表的数量会有所不同。 我尝试从代码动态创建PieChart,但它不起作用。我的布局正确 - 按钮已成功添加。你可以帮我吗?有些代码: 布局:Androidplot - 创建没有XML的图表

<ScrollView 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
tools:context="example.bros.nik.tabs1.MealsActivity" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/l_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:orientation="vertical" > 
</LinearLayout> 
</ScrollView> 

的Java:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_meals); 
    LinearLayout l_layout = (LinearLayout) findViewById(R.id.l_layout); 
    meals_params = ResultsActivity.get_meals_params();   

    LinearLayout.LayoutParams lp_view = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 
      LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f); 

    PieChart pie = new PieChart(this, "Chart#1"); 

    Segment s1 = new Segment("Углеводы", meals_params[0].get_carbohydrates_percent()); 
    Segment s2 = new Segment("Жиры", meals_params[0].get_fats_percent()); 
    Segment s3 = new Segment("Белки", meals_params[0].get_proteins_percent()); 

    EmbossMaskFilter emf = new EmbossMaskFilter(new float[]{1, 1, 1}, 0.4f, 10, 8.2f); 

    SegmentFormatter sf1 = new SegmentFormatter(); 
    sf1.configure(getApplicationContext(), R.xml.pie_segment_formatter1); 
    sf1.getFillPaint().setMaskFilter(emf); 

    SegmentFormatter sf2 = new SegmentFormatter(); 
    sf2.configure(getApplicationContext(), R.xml.pie_segment_formatter2); 
    sf2.getFillPaint().setMaskFilter(emf); 

    SegmentFormatter sf3 = new SegmentFormatter(); 
    sf3.configure(getApplicationContext(), R.xml.pie_segment_formatter3); 
    sf3.getFillPaint().setMaskFilter(emf); 

    pie.addSeries(s1, sf1); 
    pie.addSeries(s2, sf2); 
    pie.addSeries(s3, sf3); 


    pie.getRenderer(PieRenderer.class).setDonutSize(0.1f,PieRenderer.DonutMode.PERCENT); 
    pie.redraw(); 
    pie.getBorderPaint().setColor(Color.TRANSPARENT); 
    pie.getBackgroundPaint().setColor(Color.TRANSPARENT); 

    l_layout.addView(pie, lp_view); 

我试试这个:

pie.setLayoutParams(lp_view); 
l_layout.addView(pie); 

,它是不会帮我。

如果我添加按钮布局:

pie.setLayoutParams(lp_view); 
l_layout.addView(pie); 

Button but = new Button(this); 
but.setText("bla"); 
l_layout.addView(but, lp_view); 

然后我看到这个按钮(看截图)。 Added button

编辑: 在Android docs所写的,在构造

ViewGroup.LayoutParams (int width, int height) 

属性可以是视绝对尺寸,或可为常量 - WRAP_CONTENT(int值-2),MATCH_PARENT(int值 - 1)。很可能,PieChart不会识别这些常量,并将其作为绝对大小的负值。 我找到了解决办法:

private int[] getDisplayParams() { 
    int[] display_params = new int[2]; 
    Display display = getWindowManager().getDefaultDisplay(); 
    if (Build.VERSION.SDK_INT >= 13) { 
     Point size = new Point(); 
     display.getSize(size); 
     display_params[0] = size.x; 
     display_params[1] = size.y; 
    } 
    else { 
     display_params[0] = display.getWidth(); 
     display_params[1] = display.getHeight(); 
    } 
    return display_params; 
} 

和屏幕的大小使用确定表的大小:

int[] display_params = getDisplayParams(); 
Double pie_size = display_params[0]*0.8; 
int pie_size_int = pie_size.intValue(); 
ViewGroup.LayoutParams lp_view = new LinearLayout.LayoutParams(pie_size_int, pie_size_int); 
+0

当您尝试此操作时会发生什么?显示的结果是否意外或您是否遇到异常? – Nick 2014-09-10 17:19:01

+0

尼克,我只看到空白屏幕......我没有得到任何例外。 – Nik 2014-09-10 17:36:02

回答

1

看起来你是不是提供了馅饼的LayoutParams。尝试添加馅饼l_layout之前这样做:

pie.setLayoutParams(new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT, 
    LinearLayout.LayoutParams.FILL_PARENT)); 

编辑: 我回去,发现该布局被封闭在一个滚动型,但滚动视图设置为包裹内容和内容的设置与父所以似乎它可能是一个鸡与鸡蛋问题as described here。我相信按钮等有这些默认非零值,而阴谋不,这可能解释为什么按钮的作品。

作为一个全面的检查,如果你指定你的情节像这样的绝对大小发生了:

LinearLayout.LayoutParams lp_view = new LinearLayout.LayoutParams(100, 100); 

你还可以尝试:

plot.setMinimumHeight(100); 
plot.setMinimumWidth(100); 
+0

不,我在这里提供饼图的LayoutParams:[l_layout.addView(pie,lp_view);] - 查看第二个参数。不过,我尝试了你的建议,但这对我没有帮助。我编辑我的帖子,看看这个。 – Nik 2014-09-11 09:40:12

+0

我尝试在LayoutParams中为PieChart使用FILL_PARENT,MATCH_PARENT,WRAP_CONTENT参数。没有结果。 – Nik 2014-09-11 09:41:42

+0

我已经更新了我的答案。 – Nick 2014-09-11 14:01:01

1

问题由尼克解决。 您也可以尝试:

plot.setMinimumHeight(100); 
plot.setMinimumWidth(100);