2013-03-27 65 views
0

我被卡住了,一雙新的眼睛將不勝感激。我的MainActivity撥打fragment,點擊button。它正在拉動它,然後我在fragment中添加database呼叫,現在它正在崩潰。在我的logcat中,它說我的onCreate中得到一個空指針異常。這裏是代碼和logcat。從NPE崩潰的Android片段onCreate

片段代碼

public class StatsFragment extends Fragment { 
    public static MySmokinDatabase mySmokinDatabase; 
    public static Model model; 
    View view; 

    public View onCreateView(LayoutInflater inflater, 
      ViewGroup container, 
      Bundle savedInstanceState) { 

     model = MainActivity.model; 
     mySmokinDatabase = new MySmokinDatabase(getActivity()); 

     TextView daysText = (TextView) getView().findViewById(R.id.days); 
     TextView totalText = (TextView) getView().findViewById(R.id.total); 
     TextView aveText = (TextView) getView().findViewById(R.id.ave); 
     try { 
      daysText.setText("" + (model.getDays())); 
      totalText.setText("" + mySmokinDatabase.getTotal()); 
      if (model.getDays() > 0) 
      aveText.setText("" + (float) mySmokinDatabase.getTotal()/(float) model.getDays()); 
     } 

     catch (Exception e) { 
      Log.v("*** DEBUG ***", "Error"); 
      System.out.print("error" + e); 
     } 

     // Create, or inflate the Fragment’s UI, and return it. 
     // If this Fragment has no UI then return null. 
     view = inflater.inflate(R.layout.stats_frag, container, false); 
     return view; 
    } 
} 

按鈕處理

public void statisticsHandler(View view) { 
    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    Log.v("*** DEBUG ***", "Statistics Handler"); 
    ft.replace(R.id.main_container_Id, new StatsFragment()); 
    ft.commit(); 
} 

logcat的

03-27 15:40:03.767: W/dalvikvm(862): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
03-27 15:40:03.867: E/AndroidRuntime(862): FATAL EXCEPTION: main 
03-27 15:40:03.867: E/AndroidRuntime(862): java.lang.NullPointerException 
03-27 15:40:03.867: E/AndroidRuntime(862): at com.example.smokin4tomsullivan.StatsFragment.onCreateView(StatsFragment.java:24) 
03-27 15:40:03.867: E/AndroidRuntime(862): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829) 
03-27 15:40:03.867: E/AndroidRuntime(862): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 
03-27 15:40:03.867: E/AndroidRuntime(862): at android.app.BackStackRecord.run(BackStackRecord.java:635) 
03-27 15:40:03.867: E/AndroidRuntime(862): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397) 
03-27 15:40:03.867: E/AndroidRuntime(862): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426) 
03-27 15:40:03.867: E/AndroidRuntime(862): at android.os.Handler.handleCallback(Handler.java:615) 
03-27 15:40:03.867: E/AndroidRuntime(862): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-27 15:40:03.867: E/AndroidRuntime(862): at android.os.Looper.loop(Looper.java:137) 
03-27 15:40:03.867: E/AndroidRuntime(862): at android.app.ActivityThread.main(ActivityThread.java:4745) 
03-27 15:40:03.867: E/AndroidRuntime(862): at java.lang.reflect.Method.invokeNative(Native Method) 
03-27 15:40:03.867: E/AndroidRuntime(862): at java.lang.reflect.Method.invoke(Method.java:511) 
03-27 15:40:03.867: E/AndroidRuntime(862): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
03-27 15:40:03.867: E/AndroidRuntime(862): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
03-27 15:40:03.867: E/AndroidRuntime(862): at dalvik.system.NativeStart.main(Native Method) 

回答

1

移動這個接近頂部,你搶前視圖。你正在得到一個NPE,因爲findViewById調用返回null。

// Create, or inflate the Fragment’s UI, and return it. 
// If this Fragment has no UI then return null. 
view = inflater.inflate(R.layout.stats_frag, container, false); 

之前你搶視圖。然後做

TextView daysText = (TextView) view.findViewById(R.id.days); 
TextView totalText = (TextView) view.findViewById(R.id.total); 
TextView aveText = (TextView) view.findViewById(R.id.ave); 
+0

謝謝,你的回答不僅修復了它顯示值的崩潰。答案將盡快接受 – IrishWhiskey 2013-03-27 20:04:58

2

設置此view = inflater.inflate(R.layout.stats_frag, container, false);之前得到您的意見如下

使用getActivity()而不是getView()同時得到的意見。

TextView daysText = (TextView) getActivity().findViewById(R.id.days); 
    TextView totalText = (TextView) getActivity().findViewById(R.id.total); 
    TextView aveText = (TextView) getActivity().findViewById(R.id.ave); 
+0

非常感謝你,我的應用程序不再崩潰。但值不顯示。下面的答案解決了這兩個問題。你會得到upvote,但他會得到複選標記 – IrishWhiskey 2013-03-27 20:02:12

+0

@IrishWhiskey是Textviews部分R.layout.stats_frag,然後在實際獲取值之前設置上下文視圖。即設置此視圖= inflater.inflate(R.layout.stats_frag,容器,false);在得到Textviews之前 – Pragnani 2013-03-27 20:05:41

+0

@IrishWhiskey更新了答案...... – Pragnani 2013-03-27 20:08:57