-1

Я пытаюсь обновить View, который представляет собой graph(MpAndroidChart=library, class=BarChart), то есть внутри Fragment, основанный на вводе, возвращенном от вызова отдыха. Я пытаюсь обновить представление с помощью метода, который называется updateGraph(), и я получаю исключение с нулевым указателем.
Код для моего метода updateGraph() приведен ниже.Исключение нулевого указателя внутри фрагмента

Любая помощь для этого была бы принята с благодарностью.

общее объяснение того, как этот метод вызываются следующим образом: My MainActivity создает работоспособный, которая вызывает updateGraph() на примере FragmentOne, что я создавать и использовать в качестве поля в моих Activity.
Затем я передаю этот runnable к моему 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

Plase делится файлом макета 'fragment_one'. –

+1

Ключ здесь 'java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.view.View android.view.View.findViewById (int)' на нулевом объекте'. Проверьте свою активность, когда вы вызываете findViewById - – ishmaelMakitla

ответ

0

Не называйте updateGraph от деятельности, как это (см вашего метода run). Фрагмент не имеет View в этой точке, поэтому getView вернет null, как видно из вашей ошибки.

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

// fragment transaction ... 

Вместо этого, вы можете обновить график фрагмента, когда фрагмент загружается. Ваш «runnable» должен быть прикреплен к фрагменту каким-то образом, если вы хотите периодически обновлять это представление.

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 e вид фрагмента был завышен.

Простым решением было бы добавить простую проверку в updateGraph как:

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

С другой стороны, вы можете добавить проверку в MainActivity. Например:

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

if (frg != null){ 
    /* call updateGraph */ 
} 
Смежные вопросы