Java Android布局问题:无法使用addView添加两个图表的两个布局(包括logcat错误)
我试图使用AChartEngine在垂直方向添加两个动态折线图。但是我在布局上遇到了一些问题。下面添加了相关的java文件、xml文件和logcat(我还有其他java文件,如Java Android布局问题:无法使用addView添加两个图表的两个布局(包括logcat错误),java,android,achartengine,Java,Android,Achartengine,我试图使用AChartEngine在垂直方向添加两个动态折线图。但是我在布局上遇到了一些问题。下面添加了相关的java文件、xml文件和logcat(我还有其他java文件,如Ubidots.java、Point.java和Context.java,但我认为这里不需要这些文件) LineGraph.java: public class LineGraph { private GraphicalView view; private TimeSeries dataset = new TimeSer
Ubidots.java
、Point.java
和Context.java
,但我认为这里不需要这些文件)
LineGraph.java:
public class LineGraph {
private GraphicalView view;
private TimeSeries dataset = new TimeSeries("LDR Values");
private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();
private XYSeriesRenderer renderer = new XYSeriesRenderer(); // This will be used to customize line 1
private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer(); // Holds a collection of XYSeriesRenderer and customizes the graph
private GraphicalView view1;
private TimeSeries dataset1 = new TimeSeries("LDR Values");
private XYSeriesRenderer renderer1 = new XYSeriesRenderer(); // This will be used to customize line 1
public LineGraph()
{
// Add single dataset to multiple dataset
mDataset.addSeries(dataset);
// Customization time for line 1!
renderer.setColor(Color.BLUE);
renderer.setPointStyle(PointStyle.SQUARE);
renderer.setFillPoints(true);
renderer.setDisplayChartValues(true);
renderer.setChartValuesSpacing(10);
// mRenderer: renderer that controls the full charts and add the single renderer for each series:
// Enable Zoom
//mRenderer.setZoomButtonsVisible(true);
mRenderer.setMarginsColor(Color.argb(0x00, 0xff, 0x00, 0x00));
mRenderer.setXTitle("Day #");
mRenderer.setYTitle("LDR Values");
mRenderer.setYAxisMax(35000);
mRenderer.setYAxisMin(20000);
mRenderer.setShowGrid(true);
mRenderer.setInScroll(true);
// Add single renderer to multiple renderer
mRenderer.addSeriesRenderer(renderer);
/////////////////////////////////////
mDataset.addSeries(dataset1);
// Customization time for line 1!
renderer1.setColor(Color.BLUE);
renderer1.setPointStyle(PointStyle.SQUARE);
renderer1.setFillPoints(true);
renderer1.setDisplayChartValues(true);
renderer1.setChartValuesSpacing(10);
// mRenderer: renderer that controls the full charts and add the single renderer for each series:
// Enable Zoom
//mRenderer.setZoomButtonsVisible(true);
mRenderer.setMarginsColor(Color.argb(0x00, 0xff, 0x00, 0x00));
mRenderer.setXTitle("Day #");
mRenderer.setYTitle("Soil Humidity Values");
mRenderer.setYAxisMax(35000);
mRenderer.setYAxisMin(20000);
mRenderer.setShowGrid(true);
mRenderer.setInScroll(true);
// Add single renderer to multiple renderer
mRenderer.addSeriesRenderer(renderer1);
}
public GraphicalView getView(Context context)
{
view = ChartFactory.getLineChartView(context, mDataset, mRenderer);
return view;
}
public void addNewPoints(Point p)
{
dataset.add(p.getX(), p.getY());
}
public GraphicalView getView1(Context context)
{
view1 = ChartFactory.getLineChartView(context, mDataset, mRenderer);
return view1;
}
public void addNewPoints1(Point p1)
{
dataset1.add(p1.getX(), p1.getY());
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.teerna.smartagriculturev5.MainActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:id="@+id/linearParent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/chart1"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:background="#a11111"
android:orientation="vertical"/>
<LinearLayout
android:id="@+id/chart2"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:background="#a11111"
android:orientation="vertical"/>
</LinearLayout>
</ScrollView>
</RelativeLayout>
日志:
02-07 21:28:07.203 26865-26865/com.example.teerna.smartagriculturev5 E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.teerna.smartagriculturev5/com.example.teerna.smartagriculturev5.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
at android.app.ActivityThread.access$700(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5283)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.view.ViewGroup.addViewInner(ViewGroup.java:3565)
at android.view.ViewGroup.addView(ViewGroup.java:3437)
at android.view.ViewGroup.addView(ViewGroup.java:3413)
at com.example.teerna.smartagriculturev5.MainActivity.onStart(MainActivity.java:109)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1181)
at android.app.Activity.performStart(Activity.java:5293)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
at android.app.ActivityThread.access$700(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5283)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
两次设置一个字段。永远都不要拿第二。试一试
view1 = line1.getView1(this);
两次设置一个字段。永远都不要拿第二。试一试
view1 = line1.getView1(this);
MainActivity
中的第109行有一个NPE。那是哪一行?@Napster它指向这一行://setContentView(第1行)@Napster实际上我必须在这里将view
更改为view1
:view=line1.getView1(这个)代码>。但是在我注释掉行setContentView(第1行)之后代码>设置内容视图(第2行)代码>我在logcat中得到一个错误,原因是:java.lang.IllegalStateException:指定的子级已经有父级。您必须首先对子级的父级调用removeView()。
在第行setContentView(第1行)
尝试添加已具有父级布局的布局时会发生这种情况<代码>((视图组)第1行。getParent()).removeView(第1行)代码>应该可以为您解决问题。row1
有家长吗?让我们看看。在main活动的第109行有一个NPE。那是哪一行?@Napster它指向这一行://setContentView(第1行)@Napster实际上我必须在这里将view
更改为view1
:view=line1.getView1(这个)代码>。但是在我注释掉行setContentView(第1行)之后代码>设置内容视图(第2行)代码>我在logcat中得到一个错误,原因是:java.lang.IllegalStateException:指定的子级已经有父级。您必须首先对子级的父级调用removeView()。
在第行setContentView(第1行)
尝试添加已具有父级布局的布局时会发生这种情况<代码>((视图组)第1行。getParent()).removeView(第1行)代码>应该可以为您解决问题。row1
是否有父对象?让我们看看。但是,当我注释掉行setContentView(row1)代码>设置内容视图(第2行)代码>我在logcat中得到一个错误,原因是:java.lang.IllegalStateException:指定的子级已经有父级。您必须首先在子对象的父对象上调用removeView()。
在第行setContentView(第1行)
但是当我注释掉第行setContentView(第1行)时代码>设置内容视图(第2行)代码>我在logcat中得到一个错误,原因是:java.lang.IllegalStateException:指定的子级已经有父级。您必须首先在子对象的父对象上调用removeView()。
第行setContentView(第1行)
view = line.getView(this);
view = line1.getView1(this);
view1 = line1.getView1(this);