0

je dois mettre en œuvre à la fois TimePicker personnalisé et DatePicker DialogPreferences dans mon projet. La première boîte de dialogue DatePicker doit être appelée, puis TimePicker. Je les ai implémentés dans mon projet à l'aide des tutoriels this et this.appel DatePicker Heure personnalisée DialogPreference de la coutume DialogPreference

Je pense que je devrais appeler TimePreference dans la méthode onDialogClosed du DatePreference. je le fais comme ça:

@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(); 
     } 
    } 
} 

Mais je reçois un NullPointerException. La question est comment puis-je appeler ma boîte de dialogue TimePreference personnalisée par programme après le travail DatePreference et définir les deux valeurs à la DatePreference. Ou je devrais créer différent ListPreference personnalisé qui devrait implémenter ces deux éléments?

Répondre

0

J'ai créé Voir personnalisé qui ressemble à ListPreference et mis en œuvre cette solution.

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); 

    } 

dans la méthode onCreate():

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; 
     } 

     }); 
Questions connexes