2017-01-02 7 views
3

次のコードを使用して、EditTextからDatePickerDialogを作成しています。autoclose DatePickerDialog

import android.widget.DatePicker; 
import android.app.DatePickerDialog; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Locale; 

Calendar myCalendar = Calendar.getInstance(); 

String myFormat = "MM/dd/yy"; 
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US); 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

EditText datePicker = (EditText) findViewById(R.id.popUpDate); 
datePicker.setText(sdf.format(myCalendar.getTime())); 

datePicker.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     new DatePickerDialog(AddAccount.this, R.style.AppTheme_Dialog, new DatePickerDialog.OnDateSetListener() { 
      @Override 
      public void onDateSet(DatePicker view, int year, int monthOfYear, 
            int dayOfMonth) { 
       myCalendar.set(Calendar.YEAR, year); 
       myCalendar.set(Calendar.MONTH, monthOfYear); 
       myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
       datePicker.setText(sdf.format(myCalendar.getTime())); 
      } 
     }, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), 
       myCalendar.get(Calendar.DAY_OF_MONTH)).show(); 
    } 
}); 
} 

日付を選択した後に自動的にデフォルトのものを閉じることはできますか?または、それはdatepickerウィジェットの完全なリメイクを必要としますか?

+0

私の答えを確認してください –

答えて

2

以下のコードを試してみてください

import static yourPackageName.MainActivity.sdf; // get static imports 


    public class MyPicker extends DatePickerDialog { 

    Context context; 
    @Override 
    public DatePicker getDatePicker() { 
     return super.getDatePicker(); 
    } 


    public MyPicker(Context context, int themeResId, OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth) { 
     super(context, themeResId, listener, year, monthOfYear, dayOfMonth); 
     this.context = context; 
    } 

    @Override 
    public void onDateChanged(DatePicker view, int year, int month, int dayOfMonth) { 
     myCalendar.set(Calendar.YEAR, year); 
     myCalendar.set(Calendar.MONTH, month); 
     myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
     datePicker.setText(sdf.format(myCalendar.getTime())); 
     datePickerDialog.dismiss(); 
    } 
} 
は今 MainActivity

public class MainActivity extends AppCompatActivity { 


    public static Calendar myCalendar = Calendar.getInstance(); 


    public static String myFormat = "MM/dd/yy"; 
    public static SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US); 
    public static EditText datePicker; 
    public static MyPicker datePickerDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     datePicker = (EditText) findViewById(R.id.popUpDate); 
     datePicker.setText(sdf.format(myCalendar.getTime())); 

     datePicker.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       datePickerDialog = new MyPicker(MainActivity.this, R.style.AppTheme_Dialog, new DatePickerDialog.OnDateSetListener() { 
        @Override 
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
        } 
       }, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH)); 
       datePickerDialog.show(); 
      } 

     }); 
    } 

} 
} 

にあなたのメインクラスを想定してか、スタイル

public class MainActivity extends AppCompatActivity { 

    public String myFormat = "MM/dd/yy"; 
    public SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US); 
    public EditText datePicker; 
    final Calendar calendar = Calendar.getInstance(); 
    private DatePickerDialog datePickerDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     datePicker = (EditText) findViewById(R.id.popUpDate); 
     datePicker.setText(sdf.format(calendar.getTime())); 

     datePicker.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       datePickerDialog = new DatePickerDialog(MainActivity.this, null, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); 
       datePickerDialog.getDatePicker().init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() { 
        @Override 
        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
         calendar.set(Calendar.YEAR, year); 
         calendar.set(Calendar.MONTH, monthOfYear); 
         calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
         datePicker.setText(sdf.format(calendar.getTime())); 
         datePickerDialog.dismiss(); 
        } 
       }); 
       datePickerDialog.show(); 
      } 
     }); 
    } 
} 

魔法のように動作を適用する必要がない場合は!

+0

私はそれを私の答えと似ていると思います。あなたの 'MyPicker'では、あなたが定義したコンテキストは使用されません。また、getDatePickerは必要ありません。 –

+0

はい、これはDatePickerDialogを継承するクラスです。私はそれを投稿することができるように削除されました。どのようにしても、同じメソッドonDateChangedメソッドにアクセスして、日付の変更を識別し、最初にテーマを適用しました。 –

+0

@CharukaはdatePickerDialog 'アクティビティが呼ばれる現在の日付として?最後に選択したものに常にデフォルト設定されているようです。 – Leb

1

現在の動作は問題ありませんか?

自動的に終了する場合は...!どのようにしてシステムが希望の日付と時刻を で選択したのか、または間違ってそれを選択したことを知る方法はありません..... イベントの代わりに自動的に閉じることができます。

しかし、onDateSetで終了できます。

更新:このように閉じることができます。 DatePickerを含む

// open datepicker dialog. 
// set date picker for current date 
// add pickerListener listner to date picker 

    DatePickerDialog dialog = new DatePickerDialog(this, pickerListener, year, month,day); 
    dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Text", new DialogInterface 
      .OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
      if (which == DialogInterface.BUTTON_NEGATIVE) { 
       // Do Stuff 
      Log.i("dialog click", "dialog negative button clicked"); 
      dialog.dismiss(); 
      } 
      } 
     }); 
    dialog.dismiss(); 
+0

あなたが誤って1つを選択した場合、それは再開するのが難しくない場合は、日付を選択すると終了します。あなたは誤って1つをクリックするよりも正しい日付を選ぶ可能性が高いという考えです。自動的に閉じると、全体的なユーザーにとってより良いルートになります。 - 問題は 'oneDateSet'内に含めるコマンド – Leb

+0

があなたのAndroidの組み込み日付ピッカーまたは他のlibを使用しているかどうかわかりません。 –

+0

内蔵のものです。 – Leb

2

DatePickerDialog。そしてDatePickerOnDateChangedListenerです。
あなたは

final Calendar calendar = Calendar.getInstance(); 
int year = calendar.get(Calendar.YEAR); 
int month = calendar.get(Calendar.MONTH); 
int day = calendar.get(Calendar.DAY_OF_MONTH); 

final DatePickerDialog datePickerDialog = 
    new DatePickerDialog(YourActivity.this, null, year, month, day); 

datePickerDialog.getDatePicker() 
    .init(year, month, day, new DatePicker.OnDateChangedListener() { 
     @Override 
     public void onDateChanged(DatePicker view, int year, int monthOfYear, 
      int dayOfMonth) { 
      Toast.makeText(YourActivity.this, "day" + dayOfMonth + "-month" + monthOfYear + 1 + "-year" + year, Toast.LENGTH_SHORT).show(); 
      // dismiss the popup when choose a date 
      datePickerDialog.dismiss(); 
     } 
    }); 
datePickerDialog.show(); 

のように日付を選択すると、このソリューションは、あなたのケースのために働くだろうリスナーにOnDateChangedListenerを使用することができますが、私はそれはほとんどのAndroidアプリの利用デフォルトDatePickerDialogフローので、ユーザーエクスペリエンス(UX)については非常に良いではないと思います

0

@Phan、MyPickerクラス:)を作成し

DatePickerDialog dialog; 

datePicker.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     dialog = new DatePickerDialog(AddAccount.this, R.style.AppTheme_Dialog, new DatePickerDialog.OnDateSetListener() { 
      @Override 
      public void onDateSet(DatePicker view, int year, int monthOfYear, 
            int dayOfMonth) { 
       myCalendar.set(Calendar.YEAR, year); 
       myCalendar.set(Calendar.MONTH, monthOfYear); 
       myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
       datePicker.setText(sdf.format(myCalendar.getTime())); 

if(dialog != null) { 
dialog.dismiss(); 
} 
      } 
     }, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), 
       myCalendar.get(Calendar.DAY_OF_MONTH)); 
dialog.show(); 
    } 
}); 
+0

私たちが日付を選択したときにすぐにOPを却下したいというダイアログが表示されます。曜日を選択してからOKを押してください。 –

関連する問題