2012-09-21 52 views
0

如何在android中创建条形图?如何在android中使用web服务创建条形图?

注: - 但我需要从Web服务使用x轴和y轴值。 这意味着Web服务将显示x和y轴的值。然后,我需要使用这些值作为x和y轴值来创建条形图。

如何做到这一点?建议请。

logcat的

09-21 15:09:53.103: D/AndroidRuntime(271): Shutting down VM 
09-21 15:09:53.103: W/dalvikvm(271): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
09-21 15:09:53.114: E/AndroidRuntime(271): FATAL EXCEPTION: main 
09-21 15:09:53.114: E/AndroidRuntime(271): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.xmlparsing_test/com.example.xmlparsing_test.BarGraphActivity}: java.lang.NullPointerException 
09-21 15:09:53.114: E/AndroidRuntime(271): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
09-21 15:09:53.114: E/AndroidRuntime(271): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
09-21 15:09:53.114: E/AndroidRuntime(271): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
09-21 15:09:53.114: E/AndroidRuntime(271): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
09-21 15:09:53.114: E/AndroidRuntime(271): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-21 15:09:53.114: E/AndroidRuntime(271): at android.os.Looper.loop(Looper.java:123) 
09-21 15:09:53.114: E/AndroidRuntime(271): at android.app.ActivityThread.main(ActivityThread.java:4627) 
09-21 15:09:53.114: E/AndroidRuntime(271): at java.lang.reflect.Method.invokeNative(Native Method) 
09-21 15:09:53.114: E/AndroidRuntime(271): at java.lang.reflect.Method.invoke(Method.java:521) 
09-21 15:09:53.114: E/AndroidRuntime(271): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
09-21 15:09:53.114: E/AndroidRuntime(271): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
09-21 15:09:53.114: E/AndroidRuntime(271): at dalvik.system.NativeStart.main(Native Method) 
09-21 15:09:53.114: E/AndroidRuntime(271): Caused by: java.lang.NullPointerException 
09-21 15:09:53.114: E/AndroidRuntime(271): at com.example.xmlparsing_test.BarGraphActivity.buildBarDataset(BarGraphActivity.java:115) 
09-21 15:09:53.114: E/AndroidRuntime(271): at com.example.xmlparsing_test.BarGraphActivity.DrawGraph(BarGraphActivity.java:57) 
09-21 15:09:53.114: E/AndroidRuntime(271): at com.example.xmlparsing_test.BarGraphActivity.onCreate(BarGraphActivity.java:22) 
09-21 15:09:53.114: E/AndroidRuntime(271): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
09-21 15:09:53.114: E/AndroidRuntime(271): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
09-21 15:09:53.114: E/AndroidRuntime(271): ... 11 more 
09-21 15:10:04.033: I/Process(271): Sending signal. PID: 271 SIG: 9 

chart.java

public class Chart extends Activity 
{  
    EditText edt1,edt2; 
TextView txtv1; 
Button btn; 

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

    edt1 = (EditText)findViewById(R.id.editText1); 
    edt2 = (EditText)findViewById(R.id.editText2); 

    btn = (Button)findViewById(R.id.button1); 
    btn.setOnClickListener(new View.OnClickListener() 
    { 

public void onClick(View v) 
{ 
    getTMSChart(edt1.getText().toString(),edt2.getText().toString()); 

    Intent intnt = new Intent(v.getContext(), BarGraphActivity.class); 
      startActivity(intnt); 
     } 
    }); 
    } 
public void getTMSChart(String FromDate, String ToDate) 
    { 
    System.setProperty("http.keepAlive", "false");   
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);   

    envelope.dotNet = true; 

    String METHOD = "GetTMSChart"; 
    String NAMESPACE = "http://tempuri.org/"; 
    String SOAP_ACTION = "http://tempuri.org/GetTMSChart"; 
    String URL = "http://54.251.60.177/TMSOrdersService/TMSDetails.asmx"; 

    SoapObject request = new SoapObject(NAMESPACE, METHOD); 

    request.addProperty("FromDate","");    
    request.addProperty("ToDate",""); 

    envelope.setOutputSoapObject(request); 


    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

    try 
    { 
     androidHttpTransport.call(SOAP_ACTION, envelope); 
     SoapObject result = (SoapObject) envelope.bodyIn; 
     SoapObject root = (SoapObject) ((SoapObject)(result).getProperty(0)).getProperty("NewDataSet"); 
     int tablesCount = root.getPropertyCount(); 

    for (int i = 0; i < tablesCount; i++) 
    { 
     SoapObject table = (SoapObject) root.getProperty(i); 
     int propertyCount = table.getPropertyCount(); 

    for (int j = 0; j < propertyCount; j++) 
    {   
     //String ord = table.getPropertyAsString(""); 

     int orderNo = Integer.parseInt(table.getPropertyAsString("Order_No")); 
     int freightRate = Integer.parseInt(table.getPropertyAsString("Freight_Rate")); 
     int marginPercent =  Integer.parseInt(table.getPropertyAsString("Margin_Percent")); 
     } 
    } 
} 
catch (Exception e) 
{} 
} } 

BarGraphActivity.java

public class BarGraphActivity extends Chart 
{ 
public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main1); 
    DrawGraph(); 
    } 
Chart ch = new Chart(); 


public void DrawGraph() 
{ 

String[] titles = new String[] { " Barcharts",""}; 

int[] x_axis =null; 
int[] y_axis =null; 

List<int[]> values = new ArrayList<int[]>(); 
values.add(x_axis); 
values.add(y_axis); 

int[] colors = new int[] { Color.WHITE, Color.BLACK}; 

XYMultipleSeriesRenderer renderer = buildBarRenderer(colors); 
renderer.setOrientation(Orientation.HORIZONTAL); 
setChartSettings(renderer, "some texts", " ", " ",0,x_axis, 0,y_axis, Color.GRAY, Color.LTGRAY); 

renderer.setXLabels(1); 
renderer.addXTextLabel(2, "orderNo"); 
renderer.addYTextLabel(2, "freight"); 
renderer.setPanEnabled(false, false); 

int length = renderer.getSeriesRendererCount(); 
for (int i = 0; i < length; i++) 
{ 
    SimpleSeriesRenderer seriesRenderer = renderer.getSeriesRendererAt(i); 
    seriesRenderer.setDisplayChartValues(true); 
    } 

    ChartFactory.getBarChartIntent(this, buildBarDataset(titles, values), renderer,Type.DEFAULT); 
    } 

public XYMultipleSeriesRenderer buildBarRenderer(int[] colors) 
{ 
    // creates a SeriesRenderer and initializes it with useful default values as well as colors 

XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); 

renderer.setAxisTitleTextSize(15); 
renderer.setChartTitleTextSize(20); 
renderer.setLabelsTextSize(15); 
renderer.setLegendTextSize(15); 

int length = colors.length; 
for (int i = 0; i < length; i++) 
{ 
    SimpleSeriesRenderer r = new SimpleSeriesRenderer(); 
    r.setColor(colors[i]); 
    renderer.addSeriesRenderer(r); 
    } 
    return renderer; 
    } 

public void setChartSettings(XYMultipleSeriesRenderer renderer, String title, String xTitle,String yTitle, int xMin, int[] x_axis, int yMin, int[] y_axis, int axesColor,int labelsColor) 
{ 
    // sets lots of default values for this renderer 

renderer.setChartTitle(title); 

renderer.setXTitle(xTitle); 
renderer.setYTitle(yTitle); 

renderer.setXAxisMin(xMin); 

renderer.setYAxisMin(yMin); 
renderer.setAxesColor(axesColor); 
renderer.setLabelsColor(labelsColor); 

renderer.setApplyBackgroundColor(true); 
renderer.setBackgroundColor(Color.BLACK); 
} 

public XYMultipleSeriesDataset buildBarDataset(String[] titles, List<int[]> values) 
{ 
    // adds the axis titles and values into the dataset 

XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); 

int length = titles.length; 

for (int i = 0; i < length; i++) 
{ 
    CategorySeries series = new CategorySeries(titles[i]); 

    int[] v = values.get(i); 

    int seriesLength = v.length; 

    for (int k = 0; k < seriesLength; k++) 
    { 
    series.add(v[k]); 
    } 

    dataset.addSeries(series.toXYSeries()); 
    } 
    return dataset; 
    } } 

谢谢s为您的宝贵时间!

+0

问题是什么? - 你可以马上写一个的AsyncTask在doInBackground调用WS和分析数据分成两个ArrayList中,然后传入的AsyncTask的onPostExecute数组列表,并有使用这两个数组列表创建图表。 – MKJParekh

+0

@MKJParekh其实我试过了,就像你所建议的那样。但是我在logcat上得到了一些空指针异常。 – Nakshatran

+0

然后发布您的日志。 –

回答

2

1-从Web服务获取值。

这与条形图无关。只需调用Web服务并获取所需的值即可。

2-一旦你有了值,你可以使用achartengine来创建一个条形图。

编辑:

在这里读您的更新是我的总体思路。

chart.java中,您正在调用Web服务并将值读入局部变量,因此这些值不会存储在任何位置。

BarGraphActivity.DrawGraph()x_axisy_axis总是null,因此NullPointerException

解决办法:

在您的第一项活动收集自己的价值观int阵列和在当你开始你的第二个活动的意图给他们。

在后者中,检索数组并将它们传递给DrawGraph()

还有一个注意事项:您正在主线程上调用Web服务,这不可取。您应该将其转换为AsyncTaskdoInBackground()方法。

+0

请访问我的问题,我再次给我logcat的参考 – Nakshatran

+0

其实我从完美网络服务获取价值,但我解析到条形图的方式是错误的,我认为? – Nakshatran

+0

请发布你的'onCreate()'和'DrawGraph()'方法。 –

0

看起来像一些不好的XML给我。你的解析器给了你一个NullPointerException

我不知道你的Android代码正在使用哪种解析器,SAX或DOM。我不知道您调用的服务是否发回XML raw或包装在SOAP信封中。我不知道您是否使用了知道如何从SOAP信封中提取有效内容的SOAP客户端。一旦拥有了数据,我不知道您的数据正在做什么。

但你应该。

+0

的值时,得到了一些错误,但我在将这些值解析到条形图时出现一些错误。 – Nakshatran