【发布时间】:2019-09-14 21:44:59
【问题描述】:
我使用 MPandroidchart 在 android studio 上的片段中创建了一个折线图,并使其图表的点来自用户输入。但是,我收到错误“java.lang.NullPointerException”。我了解此错误是由于尝试使用 null 值引起的,但我不确定如何在我的情况下修复它。
编辑:用户输入保存在房间数据库中
我从有代码的方法中检索用户输入,以确保输入为空时不保存。我认为这个问题是因为图表在用户添加数据之前试图构建,因为输入选项是显示图表的片段的一部分,所以图表试图在数据准备好之前构建。
Graph.java
public class Graph extends Fragment {
public Graph() {
// Required empty public constructor
}
private LineChart mChart;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_graph, container, false);
//initialize input1 database
InputRoomDatabase db = Room.databaseBuilder(getActivity(),InputRoomDatabase.class, "input_database")
.build();
//initialize chart
mChart = view.findViewById(R.id.chart);
//set description
Description description = new Description();
description.setText("Blood glucose levels");
mChart.setDescription(description);
//set description if no data is available
mChart.setNoDataText("No Data Available. Add a blood glucose level input to see your graph");
//enable touch gestures
mChart.setTouchEnabled(true);
//enable scaling and dragging
mChart.setDragEnabled(true);
mChart.setScaleEnabled(true);
//draw background grid
mChart.setDrawGridBackground(true);
//draw x-axis
XAxis xAxis = mChart.getXAxis();
xAxis.setEnabled(false);
// setting position to TOP and INSIDE the chart
xAxis.setPosition(XAxis.XAxisPosition.TOP_INSIDE);
// setting text size for our axis label
xAxis.setTextSize(10f);
xAxis.setTextColor(Color.BLACK);
// to draw axis line
xAxis.setDrawAxisLine(true);
xAxis.setDrawGridLines(false);
YAxis yAxis = mChart.getAxisLeft();
// setting the count of Y-axis label's
yAxis.setLabelCount(12, false);
yAxis.setTextColor(Color.BLACK);
yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
yAxis.setDrawGridLines(true);
mChart.getAxisRight().setEnabled(false);
// add data
setData();
mChart.getLegend().setEnabled(false);
// refresh the chart
mChart.notifyDataSetChanged();
mChart.invalidate();
return view;
}
private void setData(){
ArrayList<Entry> values = new ArrayList<>();
**
Double d = getActivity().getIntent().getExtras().getDouble("STRING_I_NEED");
**
float myDataSet = d.floatValue();
values.add(new Entry(1,myDataSet));
LineDataSet set1;
if (mChart.getData() != null &&
mChart.getData().getDataSetCount() > 0) {
set1 = (LineDataSet) mChart.getData().getDataSetByIndex(0);
set1.setValues(values);
mChart.getData().notifyDataChanged();
mChart.notifyDataSetChanged();
} else {
set1 = new LineDataSet(values, "Blood Glucose Levels");
set1.setDrawIcons(false);
set1.setLineWidth(2f);
set1.setCircleRadius(3f);
set1.setDrawCircleHole(false);
set1.setValueTextSize(9f);
set1.setFormLineWidth(1f);
set1.setFormSize(15.f);
set1.setColor(Color.BLACK);
set1.setCircleColor(Color.BLACK);
}
ArrayList<ILineDataSet> dataSets = new ArrayList<>();
dataSets.add(set1);
LineData data = new LineData(dataSets);
mChart.setData(data);
}
}
Tabbed.java(片段的基类)(仅相关代码)
//getting inputs from room and putting them into the view in table
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mInputViewModel = ViewModelProviders.of(this).get(InputViewModel.class);
//only add if there is a new input
if (requestCode == INPUT_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
//retrieve input from room database
Input1 input1 = new Input1(data.getStringExtra(input.EXTRA_REPLY));
//insert the inputs into the view model of the recyclerView
mInputViewModel.insert(input1);
//convert the String input1 to a double
Double d = Double.parseDouble(input1.getValue());
//display pop-up if blood is above target
if (d > 8.0) {
Toast.makeText(
getApplicationContext(),
R.string.PopupHigh,
Toast.LENGTH_LONG).show();
}
//display pop-up if blood is below target
if (d < 4.0) {
Toast.makeText(
getApplicationContext(),
R.string.PopupLow,
Toast.LENGTH_LONG).show();
}
Intent i = new Intent(Tabbed.this, Graph.class);
i.putExtra("STRING_I_NEED", d);
//display pop-up if no input is added don't save the input
} else {
Toast.makeText(
getApplicationContext(),
R.string.empty_not_saved,
Toast.LENGTH_LONG).show();
}
}
public static final int INPUT_ACTIVITY_REQUEST_CODE = 1;
}
当我运行应用程序时,它崩溃并出现此错误
java.lang.NullPointerException: Attempt to invoke virtual method 'double android.os.Bundle.getDouble(java.lang.String)' on a null object reference
我在 Graph.java 中用 ** 标记了问题代码
正如我所说,我认为问题是在数据准备好之前尝试构建图表,但我不确定如何避免这个问题。
感谢您的帮助!
【问题讨论】:
标签: java android android-studio nullpointerexception mpandroidchart