2015-02-07 2 views
0

Я пытаюсь показать пользовательский минутный интервал в таймере, поэтому вот что я пытаюсь сделать. В моей MainActivity у меня есть этот метод (называемый на кнопку мыши), который открывает объявление DialogFragment:Почему я получаю ошибку ссылки на нулевой объект?

public void showTimePickerDialog(View v) { 
     DialogFragment newFragment = new TimePickerFragment(); 
     newFragment.show(getSupportFragmentManager(), "timePicker"); 
    } 

Вот это TimePickerFragment:

public class TimePickerFragment extends DialogFragment 
     implements DurationTimePickDialog.OnTimeSetListener { 


    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the current time as the default values for the picker 
     final Calendar c = Calendar.getInstance(); 
     int hour = c.get(Calendar.HOUR_OF_DAY); 
     int minute = 0; 

     // Create a new instance of CustomTimePickerDialog and return it 
     return new CustomTimePickerDialog(getActivity(), this, hour, minute, 
       DateFormat.is24HourFormat(getActivity())); 
    } 

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 

     String realMinute= ""; 

     switch (minute) { 
      case 1: 
       realMinute = "01"; 
       break; 
      case 2: 
       realMinute = "02"; 
       break; 
      case 3: 
       realMinute = "03"; 
       break; 
      case 4: 
       realMinute = "04"; 
       break; 
      case 5: 
       realMinute = "05"; 
       break; 
      case 6: 
       realMinute = "06"; 
       break; 
      case 7: 
       realMinute = "07"; 
       break; 
      case 8: 
       realMinute = "08"; 
       break; 
      case 9: 
       realMinute = "09"; 
       break; 
      default: 
       realMinute = String.valueOf(minute); 
       break; 
     } 

     final String selectedDate = String.valueOf(hourOfDay) + ":" + realMinute; 
     EditText selectedTimeTxt = (EditText) getActivity().findViewById(R.id.selectedTime); 
     selectedTimeTxt.setText(selectedDate); 
    } 
} 

Как вы можете видеть, я использую настраиваемый класс под названием CustomTimePickerDialog, чтобы отобразить диалог с интервалом в 10 минут. Вот код:

public class CustomTimePickerDialog extends TimePickerDialog { 

    private final static int TIME_PICKER_INTERVAL = 5; 
    private TimePicker timePicker; 
    private final OnTimeSetListener callback; 

    public CustomTimePickerDialog(Context context, OnTimeSetListener callBack, 
            int hourOfDay, int minute, boolean is24HourView) { 
     super(context, callBack, hourOfDay, minute/TIME_PICKER_INTERVAL, 
       is24HourView); 
     this.callback = callBack; 
    } 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     if (callback != null && timePicker != null) { 
      timePicker.clearFocus(); 
      callback.onTimeSet(timePicker, timePicker.getCurrentHour(), 
        timePicker.getCurrentMinute() * TIME_PICKER_INTERVAL); 
     } 
    } 

    @Override 
    protected void onStop() { 
    } 

    @Override 
    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     try { 
      Class<?> classForid = Class.forName("com.android.internal.R$id"); 
      Field timePickerField = classForid.getField("timePicker"); 
      this.timePicker = (TimePicker) findViewById(timePickerField 
        .getInt(null)); 
      Field field = classForid.getField("minute"); 

      NumberPicker mMinuteSpinner = (NumberPicker) timePicker 
        .findViewById(field.getInt(null)); 
      mMinuteSpinner.setMinValue(0); 
      mMinuteSpinner.setMaxValue((60/TIME_PICKER_INTERVAL) - 1); 
      List<String> displayedValues = new ArrayList<String>(); 
      for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) { 
       displayedValues.add(String.format("%02d", i)); 
      } 
      mMinuteSpinner.setDisplayedValues(displayedValues 
        .toArray(new String[0])); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 

Проблема заключается в том, что я получаю это странно для меня ошибка:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.NumberPicker.setMinValue(int)' on a null object reference относительно этой линии: mMinuteSpinner.setMinValue(0); - в CustomTimePickerDialog классе.

Я знаю, что я возился с вещами здесь (возможно, в классе TimePickerFragment), но, как начинающий андроид и java, я не могу распознать свою ошибку.

Не могли бы вы дать мне ключ?

+0

Что делать, если вы вызываете 'NumberPicker mMinuteSpinner = (NumberPicker) findViewById (field.getInt (timePicker)); вместо этого? И, возможно, поле Field field = TimePicker.class.getField («минута»). –

+0

@AndyTurner 'Не удается разрешить символ 'timePicker'' – Slim

+0

' this.timePicker' then. –

ответ

1
NumberPicker mMinuteSpinner = (NumberPicker) timePicker 
       .findViewById(field.getInt(null)); 

предположительно возвращается null.

+0

' this.timePicker = (TimePicker) findViewById (timePickerField .getInt (null)); 'возвращает результат. – Slim

+0

@Slim - Всегда? (Я предполагаю, что вы имеете в виду «ненулевой результат») –

+0

yep, always. Я не знаю, что не так с 'mMinuteSpinner' :( – Slim

0

android.widget.NumberPicker.setMinValue (INT) на нулевой ссылки на объект так говорит, что его называют на нулевой объект, что означает mMinuteSpinner является недействительным наверняка виртуальная машина не ошибетесь чувак просто отлаживать код Если вы нужна помощь, я помогу вам отладить

NumberPicker mMinuteSpinner = (NumberPicker) timePicker .findViewById (field.getInt (null));

 mMinuteSpinner.setMinValue(0); 
+0

:) Я уже пробовал отлаживать и верить, я ничего не вижу ... :( – Slim

+0

Имеет ли mMinuteSpinner нулевое значение? – user1530779

+0

Нет, это просто «null», и оно выбрасывает исключение – Slim

0
LayoutInflater l = getLayoutInflater(); 
final View v = l.inflate(R.layout.create_alarm_dialog, null); 

//get the number pickers 
NumberPicker hoursNP = (NumberPicker) v.findViewById(R.id.hours); 

Это, как я сделал мой, я предполагаю, что Вы должны указать вид, так что знает, где искать ID. Извините, я тоже нобов в android, и это мой первый пост-потоковый поток. Надеюсь, это поможет.

Смежные вопросы