2017-01-02 5 views
3

Ich verwende den folgenden Code, um eine DatePickerDialog aus einer EditText zu erstellen.autoclose DatePickerDialog

Ist es möglich, den Standard automatisch schließen zu lassen, nachdem ein Datum ausgewählt wurde? Oder würde das ein komplettes Remake des datepicker Widgets erfordern?

+0

Überprüfen Sie meine Antwort –

Antwort

2

erstellen MyPicker Klasse :)

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

jetzt Ihre Hauptklasse in 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(); 
      } 

     }); 
    } 

} 
} 

vorausgesetzt, oder wenn Sie nicht brauchen,

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

wirkt wie ein Zauber Stile bewerben!

+0

Ich denke es ähnlich wie meine Antwort.und mit Ihrem 'MeinPicker', wird der Kontext, den Sie definiert haben, nicht verwendet, auch die Funktion getDatePicker ist nicht notwendig. –

+0

Ja, das ist eine Klasse, die ich benutzt habe, die DatePickerDialog erweitert. Entfernt, wie ich ein gepostetes it.In jeder Weise können wir auf die gleiche Methode zugreifen onDateChanged-Methode, die Datumsänderungen zu erkennen ermöglicht und mit meinem ersten ich ein Thema angewendet –

+0

@Charuka ist es möglich, "heutigen" Datum durch die 'datePickerDialog festlegen 'als das aktuelle Datum, an dem die Aktivität aufgerufen wird? Es scheint immer auf den zuletzt gewählten Standard zu setzen. – Leb

1

Das aktuelle Verhalten ist in Ordnung?

Wenn es automatisch schließt ...! dann, wie System wird Sie wissen, wählen Sie das gewünschte Datum und die Uhrzeit oder Sie versehentlich wählen Sie ..... dort keine Sinn des Schließens es automatisch anstelle von Ereignis Feuer.

Aber Sie können es auf onDateSet schließen.

Aktualisieren: Sie können es so schließen.

// 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

Es wird geschlossen, wenn Sie ein Datum wählen, wenn Sie versehentlich eines gewählt haben, wird es nicht schwer sein, wieder zu öffnen. Die Idee ist, dass Sie eher ein korrektes Datum wählen, als versehentlich auf eins zu klicken. Ein automatisches Schließen wäre also eine bessere Route für den gesamten Benutzer. - Das Problem ist, ich bin mir nicht sicher, was der Befehl innerhalb der "OneDateSet" – Leb

+0

enthalten Sie Android eingebaute Datum Picker oder andere lib? –

+0

Der eingebaute. – Leb

2

DatePickerDialog eine DatePicker enthält. Und DatePicker haben OnDateChangedListener.
können Sie OnDateChangedListener verwenden zum Hörer, wenn Sie

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

Diese Lösung ein Datum wie wählen, wird für Ihren Fall arbeiten, aber ich denke, es ist über User Experience (UX), weil fast Android App verwenden Sie die Standard DatePickerDialog Fluss ist nicht sehr gut

0

@Phan, Versuchen Sie es mit dem folgenden Code

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

das OP möchte Dialog sofort verlassen, wenn wir ein Datum wählen, nicht wenn wir einen Tag wählen, dann done drücken (oder ok drücken) –

Verwandte Themen