Question

I need help friends.

Here is my activity

public class MainActivity extends Activity {

    float values[] = { 700, 400, 100, 500, 600 };
    float values1[] = { 70, 40, 10, 50 };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinearLayout lv1 = (LinearLayout) findViewById(R.id.linear);

        values = calculateData(values);
        values1 = calculateData(values1);
        MyGraphview graphview = new MyGraphview(this, values);
        graphview.setLayoutParams(new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        lv1.addView(graphview, 0);
        MyGraphview1 graphview1 = new MyGraphview1(this, values1);
        graphview1.setLayoutParams(new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        lv1.addView(graphview1, 0);

    }

    private float[] calculateData(float[] data) {
        float total = 0;
        for (int i = 0; i < data.length; i++) {
            total += data[i];
        }
        for (int i = 0; i < data.length; i++) {
            data[i] = 360 * (data[i] / total);
        }
        return data;
    }

    public class MyGraphview extends View {
        private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        private float[] value_degree;
        RectF rectf = new RectF(150, 150, 350, 350);

        float temp = 0;

        public MyGraphview(Context context, float[] values) {

            super(context);

            value_degree = new float[values.length];
            for (int i = 0; i < values.length; i++) {
                value_degree[i] = values[i];
            }
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Random r;
            for (int i = 0; i < value_degree.length; i++) {
                if (i == 0) {
                    r = new Random();
                    int color = Color.argb(100, r.nextInt(256), r.nextInt(256),
                            r.nextInt(256));
                    paint.setColor(color);
                    canvas.drawArc(rectf, 0, value_degree[i], true, paint);

                } else {
                    temp += value_degree[i - 1];
                    r = new Random();
                    int color = Color.argb(255, r.nextInt(256), r.nextInt(256),
                            r.nextInt(256));
                    paint.setColor(color);
                    canvas.drawArc(rectf, temp, value_degree[i], true, paint);
                }
            }
        }
    }

    public class MyGraphview1 extends View {
        private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        private float[] value_degree;
        RectF rectf = new RectF(170, 370, 330, 530);

        float temp = 0;

        public MyGraphview1(Context context, float[] values) {

            super(context);

            value_degree = new float[values.length];
            for (int i = 0; i < values.length; i++) {
                value_degree[i] = values[i];
            }
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Random r;
            for (int i = 0; i < value_degree.length; i++) {
                if (i == 0) {
                    r = new Random();
                    int color = Color.argb(100, r.nextInt(256), r.nextInt(256),
                            r.nextInt(256));
                    paint.setColor(color);
                    canvas.drawArc(rectf, 0, value_degree[i], true, paint);

                } else {
                    temp += value_degree[i - 1];
                    r = new Random();
                    int color = Color.argb(255, r.nextInt(256), r.nextInt(256),
                            r.nextInt(256));
                    paint.setColor(color);
                    canvas.drawArc(rectf, temp, value_degree[i], true, paint);
                }
            }
        }
    }
}

And this is my xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/linear"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </LinearLayout>

</RelativeLayout>

And this is my result

wrong output

But Expected result is

expected output

What is wrong in my code friends. please help me. Thanks in advance.

if I remove the params so it would be

addView(view); and remove Index

        MyGraphview graphview = new MyGraphview(this, values);
//      graphview.setLayoutParams(new LinearLayout.LayoutParams(
//              LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        lv1.addView(graphview);
        MyGraphview1 graphview1 = new MyGraphview1(this, values1);
//      graphview1.setLayoutParams(new LinearLayout.LayoutParams(
//              LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        lv1.addView(graphview1);

Then my output is:

enter image description here

Was it helpful?

Solution 4

Thanks lot who all are trying to solve my problem friends. I have found solution with following modifications. I think the answer will be helpful to someone who searching solution for this problem friends. Because now I feel the last minute presser from our boss.

First my xml changes as per @Karan suggestions.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linear"        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linear1"        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </LinearLayout>

</LinearLayout>

then I override onMeasure method in both MyGraphview and MyGraphview1 classes as folling to set height as @Merlins suggestions.

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            this.setMeasuredDimension(width, height);
        }

width and height are

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
height /= 2;

then changes in onCreate method

LinearLayout lv1 = (LinearLayout) findViewById(R.id.linear);
LinearLayout lv2 = (LinearLayout) findViewById(R.id.linear1);
values = calculateData(values);
values1 = calculateData(values1);

MyGraphview graphview = new MyGraphview(this, values);
MyGraphview1 graphview1 = new MyGraphview1(this, values1);

lv1.addView(graphview);
lv2.addView(graphview1);

OTHER TIPS

You can remove the params so it would be

lv1.addView(graphview);
lv1.addView(graphview1);

you don't need it in your case.

Update: now add the weight to 1 each.

graphview.setLayoutParams(new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,1));
graphview1.setLayoutParams(new LinearLayout.LayoutParams(
              LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,1));

The problem here is that you are setting the height and width of both child views to the linearlayout values.

You should use only half the height to fit both in ;)

UPDATE

Well you can use weights, like so:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);
            params.weight = 1.0f;

graphview.setLayoutParams(params);
graphview1.setLayoutParams(params);

Or you could get the height from the lv1 params:

LinearLayour.LayoutParams lvparams = lv1.getLayoutParams();
int lvHeight = lvParams.height;

Then multiply that height by 0.5 and use it as your height argument in you view layout instead of WRAP_CONTENT

i guess you should add another linearlayout and add your addview to it for eg...

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    LinearLayout lv1 = (LinearLayout) findViewById(R.id.linear);
    LinearLayout lv2 = (LinearLayout) findViewById(R.id.linear1);
    values = calculateData(values);
    values1 = calculateData(values1);
    MyGraphview graphview = new MyGraphview(this, values);
    graphview.setLayoutParams(new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    lv1.addView(graphview, 0);
    MyGraphview1 graphview1 = new MyGraphview1(this, values1);
    graphview1.setLayoutParams(new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    lv2.addView(graphview1, 0);

}

and dont forget to add linearlayout in your xml...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top