graph(MpAndroidChart=library, class=BarChart)
を表すView
を更新しようとしています。これは、残りの呼び出しから返された入力に基づいてFragment
の内部にあります。 updateGraph()
というメソッドを使用してビューを更新しようとしましたが、nullポインタ例外が発生しています。
私のupdateGraph()
メソッドのコードは以下の通りです。フラグメント内のNULLポインタの例外
これについてのご支援をいただければ幸いです。次のようにこのメソッドが呼び出されているかの
一般的な説明は次のとおりです。私のMainActivity
は、私が作成FragmentOne
のインスタンスにupdateGraph()
を呼び出し、私のActivity
にフィールドとして使用している実行可能を作成します。
その後、その実行可能ファイルをRestCall(AsyncTask)
に渡して、アクティビティ自体を渡さないようにします。
残りの呼び出しからの情報が返されると、それをシングルトンに保存し、SharedPreferences
の場合と同様にグラフを更新します。
以下のコードは、グラフを更新するために事前定義済みの値を使用しています。この時点で単にグラフを更新しようとしているので、今説明した情報を参照する心配はありません。
public class FragmentOne extends Fragment implements Summary {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View view = inflater.inflate(R.layout.fragment_one, container, false);
return view;
}
@Override
public void updateGraph() {
BarChart theChart = (BarChart) this.getView().findViewById(R.id.chart_frag_one);
ArrayList<BarEntry> entries = new ArrayList<>();
List<TupleFloat> prices = new ArrayList<TupleFloat>();
prices.add(new TupleFloat(2,4));
prices.add(new TupleFloat(3,4));
prices.add(new TupleFloat(1,6));
prices.add(new TupleFloat(3,1));
prices.add(new TupleFloat(1,1));
prices.add(new TupleFloat(7,2));
prices.add(new TupleFloat(3,2));
int prices_length = prices.size(); // need to delete
for (int i = 1; i < prices_length+1; i++){
entries.add(new BarEntry((float) (i*2), new float[] {prices.get(i-1).getX(), prices.get(i-1).getY()}));
}
BarDataSet dataset = new BarDataSet(entries, " Summary"); // asbtract Summary
String datas[] = {"regular", "peak"};
dataset.setStackLabels(datas);
dataset.setColors(new int[] {R.color.portal_dark_blue, R.color.portal_light_blue}, getActivity());
YAxis left = theChart.getAxisLeft();
left.setAxisMaxValue(10);//dataset.getYMax()+2);
left.setAxisMinValue(0);
theChart.getAxisRight().setEnabled(false);
XAxis bottomAxis = theChart.getXAxis();
bottomAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
bottomAxis.setValueFormatter(new AxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
// return values will all be the values of the dates array
int value_i = (int) value;
Log.d("hello", Integer.toString(value_i));
switch(value_i){
case 2:
return "Jul 27";
case 4:
return "Jul 28";
case 6:
return "Jul 29";
case 8:
return "Jul 30";
case 10:
return "Jul 31";
case 12:
return "Aug 1";
case 14:
return "Aug 2";
}
return "";
}
@Override
public int getDecimalDigits() {
return 0;
}
});
bottomAxis.setAxisMinValue(0);
bottomAxis.setLabelCount(16); // size of array * 2 + 1
bottomAxis.setAxisMaxValue(dataset.getXMax()+3); // going to be dates-array based
bottomAxis.setDrawGridLines(false);
theChart.setDrawValueAboveBar(false);
theChart.setDescription("");
BarData data = new BarData(dataset);
theChart.setData(data);
// legend
Legend legend = theChart.getLegend();
legend.setYOffset(40);
legend.setPosition(Legend.LegendPosition.BELOW_CHART_CENTER);
legend.setTextSize(200);
}
}
スタックトレース:
08-09 12:59:27.312 27094-27094/com.example.schadtj.portalapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.schadtj.portalapp, PID: 27094
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
at com.example.schadtj.portalapp.FragmentOne.updateGraph(FragmentOne.java:38)
at com.example.schadtj.portalapp.MainActivity$1.run(MainActivity.java:36)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Fragment_oneのXML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fvone"
>
<LinearLayout
android:id="@+id/tobegraph"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.github.mikephil.charting.charts.BarChart
android:id="@+id/chart_frag_one"
style="@style/AppTheme"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android" />
</LinearLayout>
</LinearLayout>
MainActivity必要なコード
public class MainActivity extends Activity{
FragmentManager FM = getFragmentManager();
private BottomBar mBottomBar;
FragmentOne frag1;
@Override
public void onCreate(Bundle savedInstanceState) {
// Map of Runnables
Map<String, Runnable> rest_runnables = new HashMap<String, Runnable>();
frag1 = new FragmentOne();
Runnable summary = new Runnable() {
@Override
public void run() {
frag1.updateGraph();
}
};
rest_runnables.put("Summary", summary);
new RestUpdateAll(this, ((MyApplication) this.getApplication()).returnUser(), rest_runnables).execute();
スタックトレースの例外はありますか? –
あなたの 'fragment_one'レイアウトファイルを共有してください。 –
ここでのヒントは、java.lang.NullPointerException:仮想メソッド 'android.view.View android.view.View.findViewById(int)'をヌルオブジェクトで呼び出すことを試みています。あなたがfindViewByIdを呼び出す場所を確認してください - – ishmaelMakitla