-1

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(); 
+0

スタックトレースの例外はありますか? –

+0

あなたの 'fragment_one'レイアウトファイルを共有してください。 –

+1

ここでのヒントは、java.lang.NullPointerException:仮想メソッド 'android.view.View android.view.View.findViewById(int)'をヌルオブジェクトで呼び出すことを試みています。あなたがfindViewByIdを呼び出す場所を確認してください - – ishmaelMakitla

答えて

0

は、この(あなたのrun方法を参照)のような活動からupdateGraphを呼び出さないでください。その時点でフラグメントにはビューがないため、エラーのようにgetViewはnullを返します。断片がロードされたときに

FragmentOne f = new FragmentOne(); 
f.updateGraph(); // This is bad... Will throw error 

// fragment transaction ... 

代わりに、フラグメントのグラフを更新することができます。このビューを定期的に更新する場合は、「実行可能ファイル」をフラグメントに添付する必要があります。

public class FragmentOne extends Fragment implements Summary { 

    private BarChart theChart; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     View view = inflater.inflate(R.layout.fragment_one, container, false); 
     theChart = (BarChart) view.findViewById(R.id.chart_frag_one); 
     // Any other findViewById... 

     return view; 
    } 

    @Override 
    public void updateGraph() { 

     ArrayList<BarEntry> entries = new ArrayList<>(); 
     List<TupleFloat> prices = new ArrayList<TupleFloat>(); 
     prices.add(new TupleFloat(2,4)); 
     ... 
0

これは明らかにupdateGraphがbeforと呼ばれてきたことを意味フラグメントのビューは膨らんでいます。

簡単な解決策は次のようにupdateGraphに簡単なチェックを追加することです:

if (getView() != null){ 
    /* your code */ 
} 

逆に、あなたはMainActivityにチェックを追加することができます。例えば:

Fragment frg = (Fragment)getFragmentManager().findFragmentById(R.id.your_fragment); 

if (frg != null){ 
    /* call updateGraph */ 
} 
関連する問題