5

私の見解では、押すと DatePickerDialog がポップアップするボタンがあります。ポップアップしたダイアログには「完了」ボタンがあります。そのボタンを押すと、選択した日付が EditText ボックスに取り込まれます。

ここで、戻るボタン ( ) を押す戻るボタンと、EditText に日付が入力されます。ダイアログから値を返さずにダイアログを閉じるにはどうすればよいですか。

これは私が持っているコードです-

フラグメントを呼び出すアクティビティ:

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

ダイアログのフラグメント (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 に類似したメソッドはないようです。

値を取得せずにポップアップした日付ピッカーをキャンセル/却下する方法はありますか?

ありがとう。

4

8 に答える 8

6

[キャンセル] ボタンが機能しない (したがって [戻る] ボタン) というバグが Jelybean にあるようです。これはJelly Bean DatePickerDialog で説明されています --- キャンセルする方法はありますか?

上記の投稿でバグと回避策を報告したDavid Cesarinoは、彼の解決策をここSOに投稿しました。

cavegaは、上記のソリューションをわずかに変更して、DatePickerDialog の日付を今日の日付以外に初期化できるようにしました。コードはここにあります。私は彼のソリューションを使用して、それを機能させました。

于 2013-03-08T08:23:27.990 に答える
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");
}
于 2013-11-02T20:55:22.763 に答える
2

私もこれに苦労しましたが、解決策は非常に簡単です。DialogFragment は DialogInterface.OnCancelListener と DialogInterface.OnDismissListener を実装します。DialogInterface.OnCancelListener.onCancel は DialogInterface.OnDismissListener.onDismiss の前に呼び出されるため、日付値が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);
    }
  }
}
于 2014-12-20T13:55:31.340 に答える
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 は日付を設定し、Cancel はダイアログを閉じます。必要に応じて同じものを変更します。戻るボタンをクリックすると、ダイアログも閉じます。

于 2013-03-08T07:19:41.703 に答える
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();                           

            }
});
于 2013-03-08T07:22:31.287 に答える
0

私はあなたがこれを求めていると思います

 setOnCancelListener(new OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
    }
于 2013-03-08T07:17:16.317 に答える
0

ユーザーが戻るボタンを押したときに呼び出される次のメソッドを使用します。この方法はActivity.

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

    dialog.dismiss();
}
于 2013-03-08T07:52:11.453 に答える