2013-03-08 34 views
5

在我的看法我有一個按鈕,當按下彈出一個DatePickerDialog。 poppedup對話框有一個「完成」按鈕。當我按下該按鈕時,所選日期被填充到EditText框中。解除DatePickerDialog上按下按鈕

現在,當我按下後退按鈕(Back button)時,它仍然在EditText中填充日期。如何解除對話框而不返回任何值。

這是代碼我GOT-

它調用片段的活性:

public class TransactionActivity extends FragmentActivity implements iRibbonMenuCallback {   
    ..... 
    public void selectDate(View view) { 
     // This is the method invoked by the button 
     SelectDateFragment newFragment = new SelectDateFragment(); 
     newFragment.show(getSupportFragmentManager(), "DatePicker"); 
    } 

    public void populateSetDate(int year, int month, int day) { 
     // Puts the date in the EditText box 
     mEdit = (EditText)findViewById(R.id.DateText); 
     mEdit.setText(month+"/"+day+"/"+year); 
    } 
} 

一種用於對話框(基於this頁上的Android API導軌上)片段:

public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Calendar calendar = Calendar.getInstance(); 
     int yy = calendar.get(Calendar.YEAR); 
     int mm = calendar.get(Calendar.MONTH); 
     int dd = calendar.get(Calendar.DAY_OF_MONTH); 
     return new DatePickerDialog(getActivity(), this, yy, mm, dd); 
    } 

    public void onDateSet(DatePicker view, int yy, int mm, int dd) { 
      // Calls a method on the activity which invokes this fragment 
     ((TransactionActivity)getActivity()).populateSetDate(yy, mm+1, dd);  

    } 
} 

似乎沒有類似於onDataSet的方法來處理未設置數據的情況。

有沒有辦法取消/解僱彈出datepicker沒有得到它的價值?

謝謝。

回答

6

它看起來像有一個與Jelybean有一個錯誤的取消按鈕不工作(&因此後退按鈕)。這在Jelly Bean DatePickerDialog --- is there a way to cancel?

David Cesarino,誰報告了上述職位的錯誤和解決方法的討論,張貼了他的解決方案hereSO

cavega稍微修改了上述解決方案,以允許將DatePickerDialog中的日期初始化爲除今天的日期之外的其他日期。代碼可以在here找到。我使用他的解決方案,並使其工作。

0

我想你問這個

setOnCancelListener(new OnCancelListener() { 
       @Override 
       public void onCancel(DialogInterface dialog) { 
    } 
+0

這似乎並沒有工作。這是我的嘗試: \t'dialog.setOnKeyListener(新Dialog.OnKeyListener(){ \t \t @覆蓋 \t \t公共布爾安其(DialogInterface爲arg0,INT的keyCode, KeyEvent的事件){ \t \t \t如果(鍵代碼== KeyEvent.KEYCODE_BACK){ \t \t \t \t dialog.dismiss();} 返回false; \t} });' – Bharat 2013-03-08 07:31:25

1
public class pickerdate extends Activity { 
/** Called when the activity is first created. */ 
    private TextView mDateDisplay; 
    private Button mPickDate; 
    private int mYear; 
    private int mMonth; 
    private int mDay; 

    static final int DATE_DIALOG_ID = 0; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     mDateDisplay = (TextView) findViewById(R.id.dateDisplay); 
     mPickDate = (Button) findViewById(R.id.pickDate); 


     mPickDate.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       showDialog(DATE_DIALOG_ID); 
      } 
     }); 


     final Calendar c = Calendar.getInstance(); 
     mYear = c.get(Calendar.YEAR); 
     mMonth = c.get(Calendar.MONTH); 
     mDay = c.get(Calendar.DAY_OF_MONTH); 

     updateDisplay(); 
    } 
    private void updateDisplay() { 
     mDateDisplay.setText(
      new StringBuilder() 
        // Month is 0 based so add 1 
        .append(mMonth + 1).append("-") 
        .append(mDay).append("-") 
        .append(mYear).append(" ")); 
    } 
    private 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); 
      } 
      return null; 
     } 
} 

上面的代碼爲我工作。該對話框有設置和取消按鈕。 Set將設置日期並取消將關閉對話框。根據您的需要修改相同的內容。點擊返回按鈕也會關閉對話框。

+0

我在我的方法中使用了片段&我認爲,如果我是對的,那麼就是ICS及以上版本的方法.. – Bharat 2013-03-08 07:38:38

+0

您的意思是說上述內容在片段中不起作用。以上應該在碎片中工作。我沒有嘗試。但它應該工作。我沒有看到任何理由,爲什麼這不會工作n片段。有人可以用這個。 – Raghunandan 2013-03-08 07:44:15

0

你可以嘗試如果取消該對話框包括這在你的alertDialog

,mEdit將返回爲空。 mEdit.setText("");

AlertDialog alertDialog; 

    alertDialog.setOnCancelListener(new OnCancelListener() 
    {     
      @Override 
      public void onCancel(DialogInterface dialog) 
      { 
       // TODO Auto-generated method stub 
        mEdit.setText(""); 
        dialog.dismiss();       

      } 
}); 
+0

DatePickerDialog似乎沒有onCancel方法。這是我的: '最終DatePickerDialog對話框=新的DatePickerDialog(getActivity(),這,yy,mm,dd); \t \t dialog.setOnCancelListener(新OnCancelListener(){...}' 我得到'不適用於Eclipse的arguments'消息。 – Bharat 2013-03-08 07:35:58

+0

我不好。我錯了是與此有關。 – 2013-03-08 07:47:46

0

使用以下方法中,當用戶按下返回按鈕被調用。這種方法是Activity

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    super.onBackPressed(); 

    dialog.dismiss(); 
} 
+0

我有一個片段DatePickerDialog ()方法onBackPressed()在DialogFragment的協議中似乎沒有方法..Eclipse表示「SelectDateFragment類型的方法onBackPressed()必須覆蓋或實現一個超類型方法」 – Bharat 2013-03-08 08:06:59

+0

但是在'FragmentActivity'中有一個方法,你不覺得你可以在'DialogFragment'中創建一個監聽器,當活動獲得** Back **按鈕按下的事件時,你激活一個監聽器? – 2013-03-08 08:12:07

3

我寫標準DatePickerDialog簡單的接班人,對我工作得很好:

/** 
* Enhanced date picker dialog. Main difference from ancestor is that it calls 
* OnDateSetListener only when when pressing OK button, and skips event when closing with 
* BACK key or by tapping outside a dialog. 
*/ 
public class IBSDatePickerDialog extends DatePickerDialog { 

    public IBSDatePickerDialog(final Context context, final OnDateSetListener callBack, final int year, final int monthOfYear, final int dayOfMonth) { 
     super(context, callBack, year, monthOfYear, dayOfMonth); 
    } 

    public IBSDatePickerDialog(final Context context, final int theme, final OnDateSetListener callBack, final int year, final int monthOfYear, final int dayOfMonth) { 
     super(context, theme, callBack, year, monthOfYear, dayOfMonth); 
    } 

    @Override 
    public void onClick(final DialogInterface dialog, final int which) { 
     // Prevent calling onDateSet handler when clicking to dialog buttons other, then "OK" 
     if (which == DialogInterface.BUTTON_POSITIVE) 
      super.onClick(dialog, which); 
    } 

    @Override 
    protected void onStop() { 
     // prevent calling onDateSet handler when stopping dialog for whatever reason (because this includes 
     // closing by BACK button or by tapping outside dialog, this is exactly what we try to avoid) 

     //super.onStop(); 
    } 
} 

使用對話框的例子(免費獎金:添加取消按鈕,對話框,甚至更好的可用性):

public static class datePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

    @Override 
    public Dialog onCreateDialog(final Bundle savedInstanceState) { 

     Calendar cal = Calendar.getInstance(); 
     IBSDatePickerDialog dlg = new IBSDatePickerDialog(myActivity, this, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); 

     // Add Cancel button into dialog 
     dlg.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", (OnClickListener) null); 

     return dlg; 
    } 

    @Override 
    public void onDateSet(final DatePicker view, final int year, final int month, final int day) { 
     // TODO: do whatever you want with date selected 
    } 
} 

public void showDatePickerDialog() { 
    final datePickerFragment f = new datePickerFragment(); 
    f.show(getSupportFragmentManager(), "datePicker"); 
} 
0

相反的實現自定義DatePickerDialog,您可以實現自定義OnClickListener爲正按鈕:

DatePickerDialog dateDialog = new DatePickerDialog(this, null, year, month, day); 
datePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, 
    getResources().getString(R.string.text_done), 
    new OnDoneClickListener(datePickerDialog)); 

// <...> 

private class OnDoneClickListener implements DialogInterface.OnClickListener { 

     private DatePickerDialog mPickerDialog; 

     BirthDatePickerDialog(DatePickerDialog mPickerDialog) { 
      this.mPickerDialog = mPickerDialog; 
     } 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
      Calendar cal = Calendar.getInstance(); 
      DatePicker picker = mPickerDialog.getDatePicker(); 
      cal.set(Calendar.YEAR, picker.getYear()); 
      cal.set(Calendar.MONTH, picker.getMonth()); 
      cal.set(Calendar.DAY_OF_MONTH, picker.getDayOfMonth()); 
      spinnerDateBirth.setText(dateFormat.format(cal.getTime())); 
     } 
} 

任何後退或輕擊空白區域都會使對話無效。

2

我也爲此付出了努力,但解決方案非常簡單。 DialogFragment實現了DialogInterface.OnCancelListener和DialogInterface.OnDismissListener,並且因爲DialogInterface.OnCancelListener.onCancel在DialogInterface.OnDismissListener.onDismiss之前被調用,您可以清除onCancel中的日期值,並僅在日期值爲onDismiss時調用TransactionActivity.populateSetDate方法不是0.

另一方面:爲了使片段更獨立,片段定義了調用活動必須實現的公共接口是一種很好的做法,因此您可以在接口而不是活動上調用populateSetDate方法。

請參閱下面的代碼執行的onCancel和onDismiss的:

public class SelectDateFragment extends DialogFragment 
    implements DatePickerDialog.OnDateSetListener 
{ 

    private int year; 
    private int month; 
    private int day; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
    final Calendar calendar = Calendar.getInstance(); 
    int yy = calendar.get(Calendar.YEAR); 
    int mm = calendar.get(Calendar.MONTH); 
    int dd = calendar.get(Calendar.DAY_OF_MONTH); 
    return new DatePickerDialog(getActivity(), this, yy, mm, dd); 
    } 

    public void onDateSet(DatePicker view, int yy, int mm, int dd) { 
    // Calls a method on the activity which invokes this fragment 
    // ((TransactionActivity)getActivity()).populateSetDate(yy, mm+1, dd); 
    year = yy; 
    month = mm; 
    day = dd; 
    } 

    // Gets called before onDismiss, so we can erase the selectedDate 
    @Override 
    public void onCancel(DialogInterface dialog) { 
    year = 0; 
    month = 0; 
    day = 0; 
    } 


    @Override 
    public void onDismiss(DialogInterface dialog) { 
    if (year != 0) { 
     ((TransactionActivity)getActivity()).populateSetDate(year, month + 1, day); 
    } 
    } 
}