2017-10-09 2 views
-2

Je développe une application pour un hôtel (projet d'apprentissage personnel). Dans la page "Réserver maintenant", j'affiche 2 champs EditText. Un pour la date d'arrivée et un autre pour la date de départ.setMinDate d'un DatePicker d'un autre DatePicker

J'ai défini le DatePicker pour afficher uniquement les dates actuelles et futures en utilisant le setMinDate(). Mais ce que je veux, c'est que le Check-out DatePicker affiche (date d'arrivée + 1) comme dates sélectionnables. Ainsi, par exemple, si l'utilisateur sélectionne la date d'arrivée en tant que 24/10/2017, la sortie DatePicker doit afficher les dates à partir du 25/10/2017.

BookFragment.java

public void onStart() { 
    super.onStart(); 

    EditText inDate = v.findViewById(R.id.checkInDate); 
    inDate.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      DateDialog dialog = new DateDialog(view); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      dialog.show(ft, "Select Check-In Date"); 
     } 
    }); 

    EditText outDate = v.findViewById(R.id.checkOutDate); 
    outDate.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      EditText inDateText = v.findViewById(R.id.checkInDate); 
      if (TextUtils.isEmpty(inDateText.getText().toString())) { 
       Toast.makeText(getContext(), "Select Check-in Date first", Toast.LENGTH_SHORT).show(); 
      } else { 
       DateDialog dialog = new DateDialog(view); 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       dialog.show(ft, "Select Check-Out Date"); 
      } 
     } 
    }); 

} 

DateDialog.java

@SuppressLint("ValidFragment") 
public class DateDialog extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

EditText dateText; 
int cyear, cmonth, cday; 

public DateDialog(View view) { 
    dateText = (EditText) view; 
} 

@NonNull 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    DatePickerDialog date = new DatePickerDialog(getActivity(), this, cyear, cmonth, cday); 
    final Calendar c = Calendar.getInstance(); 
    Date currentDate = c.getTime(); 
    cyear = c.get(Calendar.YEAR); 
    cmonth = c.get(Calendar.MONTH); 
    cday = c.get(Calendar.DAY_OF_MONTH); 
    date.getDatePicker().setMinDate(currentDate.getTime()); 
    return date; 

} 

public void onDateSet(DatePicker view, int year, int month, int day) { 
    String date = day + "/" + (month + 1) + "/" + year; 
    dateText.setText(date); 
} 

book.xml

<EditText 
     android:id="@+id/checkInDate" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:focusable="false" 
     android:hint="@string/check_in_date" 
     android:inputType="date" /> 

    <EditText 
     android:id="@+id/checkOutDate" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:focusable="false" 
     android:hint="@string/check_out_date" 
     android:inputType="date" /> 

Puisque les EditText appellent la même classe DateDialog, comment puis-je la date d'arrivée et l'utiliser pour setMinDate() pour check-out?

En ce moment, ce que je fais pour contourner le problème est d'obtenir la chaîne de date de EditText, en l'analysant dans une date et en faisant la même chose pour l'extraction. Lorsque l'utilisateur clique sur le bouton « Réserver », il vérifie si le check-out est antérieure à l'enregistrement à l'aide

if (odate.before(idate)) { 
     outDateText.setError("Check-Out must be after Check-In"); 
     Toast.makeText(getContext(), "Check-Out Date must be after Check-In Date", Toast.LENGTH_SHORT).show(); 
     flag = 1; 
    } 

Cela fait le travail, mais je préfère avoir les dates désactivées qui sont avant la date d'arrivée .

+0

vous obtenez une erreur – UltimateDevil

+0

@UltimateDevil Non –

Répondre

0

Laissez votre Date est

String string_date = "24/10/2017"; 

puis, augmenter un jour à votre date

Calendar cal = Calendar.getInstance(); 
cal.setTime(string_date); 
cal.add(Calendar.DATE, 1); 
checkOutDate = cal.getTimeInMillis(); 

puis mis minDate à votre datePicker

datePicker.setMinDate(checkOutDate - 1000); 

EDIT

créer un globallong variables dateToSet dans votre DateDialog classe

comme - long dateToSet;

changer votre constructor de

public DateDialog(View view) { 
dateText = (EditText) view; 
} 

à

public DateDialog(View view, long dateToSet) { 
dateText = (EditText) view; 
//then update the value of dateToSet here 
this.dateToSet = dateToSet 
} 

alors pour votre Editext 1 utiliser cette

else { 
      Date currentDate = c.getTime(); 
      cyear = c.get(Calendar.YEAR); 
      cmonth = c.get(Calendar.MONTH); 
      cday = c.get(Calendar.DAY_OF_MONTH); 
      DateDialog dialog = new DateDialog(view,currentDate.getTime()); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      dialog.show(ft, "Select Check-Out Date"); 
     } 

pour votre Editext 2 utiliser cette

//String string_date = "24/10/2017"; 
//getting current date from editText 1 
String string_date = editText.getText().toString(); 
//check the string must not be null 
//then, increase one day to your current date 

Calendar cal = Calendar.getInstance(); 
cal.setTime(string_date); 
cal.add(Calendar.DATE, 1); 
checkOutDate = cal.getTimeInMillis(); 
DateDialog dialog = new DateDialog(view,checkOutDate); 
FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      dialog.show(ft, "Select Check-Out Date"); 

Ensuite, votre onCreateDialog doit être

public Dialog onCreateDialog(Bundle savedInstanceState) { 

DatePickerDialog date = new DatePickerDialog(getActivity(), this, cyear, cmonth, cday); 
final Calendar c = Calendar.getInstance(); 
date.getDatePicker().setMinDate(dateToSet); 
return date; 

} 

peut vous aider à

+0

Oui, mais comment obtenir et utiliser la chaîne pour le check-out DatePicker à la fois EditText appellent la même classe DateDialog? –

+0

puis créer un autre – UltimateDevil

+0

d'abord obtenir la chaîne de edittext puis enregistrez ce à une chaîne puis – UltimateDevil