0

프로젝트에서 사용자 정의 TimePicker 및 DatePicker DialogPreferences를 모두 구현해야합니다. 첫 번째 DatePicker 대화 상자를 호출 한 다음 TimePicker를 호출해야합니다. thisthis 자습서를 사용하여 프로젝트에 모두 구현했습니다.사용자 정의 DatePicker DialogPreference에서 사용자 정의 Time DialogPreference를 호출합니다.

DatePreference의 onDialogClosed 메서드에서 TimePreference를 호출해야한다고 생각합니다. 내가 그런 식으로 작업을 수행합니다

@Override 
protected void onDialogClosed(boolean shouldSave) { 
    if (shouldSave && this.changedValueCanBeNull != null) { 
     setTheDate(this.changedValueCanBeNull); 
     this.changedValueCanBeNull = null; 
     Log.i("curr context", ctx.getClass().toString()); 
     try{ 

      new TimePreference(ctx,attrs).getDialog().show(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

하지만이 경우 NullPointerException를 얻을. 질문은 어떻게 DatePreference 작업 직후 프로그래밍 방식으로 사용자 정의 TimePreference 대화 상자를 호출하고 두 값을 모두 DatePreference로 설정할 수 있는지입니다. 또는 해당 항목을 모두 구현해야하는 다른 사용자 지정 ListPreference를 만들어야합니까?

답변

0

ListPreference와 비슷한 Custom View를 작성하고이 솔루션을 구현했습니다.

하지 OnCreate
private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() { 
      public void onTimeSet(TimePicker view, int hourOfDay, int minuteOfHour) { 
       mHour = hourOfDay; 
       mMinute = minuteOfHour; 
       updateDisplay(); 

      } 
      }; 

      DatePickerDialog.OnDateSetListener mDateSetListener = 
        new DatePickerDialog.OnDateSetListener() { 
        public void onDateSet(DatePicker view, int year, int monthOfYear, 
            int dayOfMonth) { 
          mYear = year; 
          mMonth = monthOfYear; 
          mDay = dayOfMonth; 

          updateDisplay(); 
        } 
      }; 


@Override 
     protected Dialog onCreateDialog(int id) { 
       switch (id) { 
       case DATE_DIALOG_ID: 
         return new DatePickerDialog(this, 
           mDateSetListener, 
           mYear, mMonth, mDay); 

       case TIME_DIALOG_ID: 
        return new TimePickerDialog(this, mTimeSetListener, mHour, mMinute, 
         false); 
       } 
       return null; 
     } 
     protected void onPrepareDialog(int id, Dialog dialog) { 
       switch (id) { 
       case DATE_DIALOG_ID: 
         ((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay); 
         break;} 
       } 
     private void updateDisplay() { 
      String minutes = null; 
      if (mMinute>9) 
       minutes = Integer.toString(mMinute); 
      else 
       minutes = "0"+Integer.toString(mMinute); 
      if (mMonth<10) 
      deadlineCus.setSummary(
        (new StringBuilder() 
        // Month is 0 based so add 1 
        .append(mYear).append("-").append("0") 
        .append(mMonth + 1).append("-") 
        .append(mDay) 
        .append(" ").append(mHour).append(":").append(minutes)).toString() 
        ); 
      else 
       deadlineCus.setSummary(
         (new StringBuilder() 
         // Month is 0 based so add 1 
         .append(mYear).append("-") 
         .append(mMonth + 1).append("-") 
         .append(mDay) 
         .append(" ").append(mHour).append(":").append(minutes)).toString() 
         ); 
      showDialog(TIME_DIALOG_ID); 

    } 

() 메소드

DatePickerDialog.OnDateSetListener mDateSetListener = 
        new DatePickerDialog.OnDateSetListener() { 
        public void onDateSet(DatePicker view, int year, int monthOfYear, 
            int dayOfMonth) { 
          mYear = year; 
          mMonth = monthOfYear; 
          mDay = dayOfMonth; 

          updateDisplay(); 
        } 


      }; 
      TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() { 
       public void onTimeSet(TimePicker view, int hourOfDay, int minuteOfHour) { 
        mHour = hourOfDay; 
        mMinute = minuteOfHour; 
        updateDisplay(); 

       } 
       }; 

    deadlineCus.setOnTouchListener(new OnTouchListener() 
     { 

     public boolean onTouch(View arg0, MotionEvent arg1) 

     { 
       showDialog(DATE_DIALOG_ID); 
       return false; 
     } 

     });