2015-02-09 17 views
0

我有這個類,其示出爲10分鐘間隔的時間選擇器:爲什麼我在Android 4.0.3中獲取TimePicker NullPointerException?

public class TimePickerFragment extends DialogFragment 
     implements TimePickerDialog.OnTimeSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Calendar c = Calendar.getInstance(); 
     int hour = c.get(Calendar.HOUR_OF_DAY); 
     // Convert current minutes to tens 
     // 55 = 50, 56 = 00 
     int minute = c.get(Calendar.MINUTE)/10; 
     minute = (minute > 5) ? 0 : minute; 

     final TimePickerDialog tpd = new TimePickerDialog(getActivity(), this, hour, minute, 
       DateFormat.is24HourFormat(getActivity())); 

     tpd.setOnShowListener(new DialogInterface.OnShowListener() { 
      @Override 
      public void onShow(DialogInterface dialog) { 
       int tpLayoutId = getResources().getIdentifier("timePickerLayout", "id", "android"); 

       ViewGroup tpLayout = (ViewGroup) tpd.findViewById(tpLayoutId); 
       ViewGroup layout = (ViewGroup) tpLayout.getChildAt(0); 

       // Customize minute NumberPicker 
       NumberPicker minutePicker = (NumberPicker) layout.getChildAt(2); 
       minutePicker.setDisplayedValues(new String[]{"00", "10", "20", "30", "40", "50"}); 
       minutePicker.setMinValue(0); 
       minutePicker.setMaxValue(5); 
      } 
     }); 

     return tpd; 

    } 

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     minute = minute * 10; 
     // Do something with the time chosen by the user 
     final String selectedDate = String.valueOf(hourOfDay) + ":" + String.valueOf(minute); 
     EditText selectedTimeTxt = (EditText) getActivity().findViewById(R.id.selectedTime); 
     selectedTimeTxt.setText(selectedDate); 
    } 
} 

該代碼是可以正常使用的機器人Lollipop,但是當我在仿真器上運行它,或真正的設備運行Android 4.0.3它拋出但以下情況除外:

java.lang.NullPointerException對此行:ViewGroup layout = (ViewGroup) tpLayout.getChildAt(0);

錯誤是明顯的多,但我不能看到佈局組件的ID,因爲在Device monitor屏幕捕獲是不t支持API 15.

你能給我一個推動力嗎?爲什麼我得到這個錯誤?缺少什麼佈局ID?我很確定很多開發者面臨同樣的問題。我知道我在這裏錯過了一小部分,但我無法發現它。

+0

看來tpLayout沒有被提供的id找到。你沒有使用任何需要高API版本的東西嗎?如果你只是將'R.id.timePickerLayout'傳遞到'findViewById'中,會發生什麼? – 2015-02-09 12:24:18

+0

我沒有使用更高的API – Slim 2015-02-09 12:25:24

回答

2

其實問題就在這裏:

int tpLayoutId = getResources().getIdentifier("timePickerLayout", "id", "android"); 

有與API-15可用的名稱timePickerLayout沒有內部標識符。

因此tpLayoutId0這使您的tpLayout等於null;並在空對象上調用方法拋出NullPointerException

建議:不要依賴android的內部資源聲明,因爲有一個原因是它們已被設置爲私有。

+0

是的,但是'4.0.3'中的標識符名稱是什麼? – Slim 2015-02-09 12:28:46

+0

不,沒有這樣的名字,因此沒有替代品可用。 – waqaslam 2015-02-09 12:29:20

+0

但在4.0.3中應該有一種方法:( – Slim 2015-02-09 12:48:53

相關問題