package dbfields; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; import android.text.InputFilter; import android.text.InputType; import android.util.AttributeSet; import android.view.ViewGroup; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import kz.istt.locust.R; public class DateInput extends LinearLayout { private EditText etD = null; private TextView tv1 = null; //Разделитель дня и месяца private EditText etM = null; private EditText etY = null; //Задаёт видимость полей public void setVisibleDMY(String val) { if(val.toLowerCase().indexOf("d")==-1) { etD.setVisibility(INVISIBLE); if(etD.getParent()!=null) ((ViewGroup) etD.getParent()).removeView(etD); if(tv1.getParent()!=null) ((ViewGroup) tv1.getParent()).removeView(tv1); } else { etD.setVisibility(VISIBLE); if(etD.getParent()==null) addView(etD); if(tv1.getParent()==null) addView(tv1); } if(val.toLowerCase().indexOf("m")==-1) { etM.setVisibility(INVISIBLE); if(etM.getParent()!=null) ((ViewGroup) etM.getParent()).removeView(etM); if(tv1.getParent()!=null) ((ViewGroup) tv1.getParent()).removeView(tv1); } else { etM.setVisibility(VISIBLE); if(etM.getParent()==null) addView(etM); if(tv1.getParent()==null) addView(tv1); } } public DateInput(Context context, AttributeSet attr) { super(context, attr); int maxLength = 10; InputFilter[] fArray = new InputFilter[1]; fArray[0] = new InputFilter.LengthFilter(maxLength); LinearLayout.LayoutParams paramMessage = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); paramMessage.weight = (float) 1.0; etD = new EditText(context); etD.setHint(context.getResources().getString(R.string.Day)); etD.setInputType(InputType.TYPE_CLASS_NUMBER); etD.setFilters(new InputFilter[] { new InputFilter.LengthFilter(2) }); // Почему-то не работает… etD.setMaxEms(10); etD.setFilters(fArray); addView(etD, paramMessage); tv1 = new TextView(context); tv1.setText("."); addView(tv1); etM = new EditText(context); etM.setHint(context.getResources().getString(R.string.Month)); etM.setInputType(InputType.TYPE_CLASS_NUMBER); etM.setFilters(new InputFilter[] { new InputFilter.LengthFilter(2) }); // Почему-то не работает… etM.setMaxEms(10); etM.setFilters(fArray); addView(etM, paramMessage); TextView tv = new TextView(context); tv.setText("."); addView(tv); etY = new EditText(context); etY.setHint(context.getResources().getString(R.string.Year)); etY.setInputType(InputType.TYPE_CLASS_NUMBER); etY.setFilters(new InputFilter[] { new InputFilter.LengthFilter(4) }); // Почему-то не работает… etY.setMaxEms(10); etY.setMinWidth(80); etY.setFilters(fArray); addView(etY, paramMessage); } /** * Секунд с начала 1970 года */ public void setDate(Long date) { if (date == null) setDate((Date) null); else setDate(new Date(date * 1000L)); } public void setDate(Date date) { if (date == null) { etD.setText(""); etM.setText(""); etY.setText(""); } else { etD.setText(new SimpleDateFormat("dd").format(date)); etM.setText(new SimpleDateFormat("MM").format(date)); etY.setText(new SimpleDateFormat("yyyy").format(date)); } } /** * Получить секунд с начала 1970 года по гринвичу * * @return */ public Long getDate() { Date d = null; SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); try { String day = etD.getText().toString(); if(day.equals("") && etD.getVisibility() == INVISIBLE) day="01"; //Если не виден и не задан день то 1е число if(!day.equals("")) { if(Integer.valueOf(day)<0 || Integer.valueOf(day)>31) return null; } String month = etM.getText().toString(); if(month.equals("") && etM.getVisibility() == INVISIBLE) month="01"; //Если не виден и не задан день то 1е число if(!month.equals("")) { if(Integer.valueOf(month)<0 || Integer.valueOf(month)>12) return null; } String year = etY.getText().toString(); if(year.equals("") && etY.getVisibility() == INVISIBLE) year="1970"; if(!year.equals("")) { if(Integer.valueOf(year)<1970 || Integer.valueOf(year)>2999) return null; } d = sdf.parse(day + "/" + month + "/" + year); } catch (ParseException e) { return null; } return d.getTime() / 1000L; } @Override public String toString() { return String.valueOf(getDate()); } @Override public boolean isSaveEnabled() { return true; } // Класс для сохранения изменений сделаных пользователем при повороте экрана public static class SavedStateDI extends BaseSavedState { //Не может быть null почемуто вылетает! String day = ""; String month = ""; String year = ""; SavedStateDI(Parcelable superState) { super(superState); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeString(day); out.writeString(month); out.writeString(year); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public SavedStateDI createFromParcel(Parcel in) { return new SavedStateDI(in); } public SavedStateDI[] newArray(int size) { return new SavedStateDI[size]; } }; private SavedStateDI(Parcel in) { super(in); day = in.readString(); month = in.readString(); year = in.readString(); } } @Override protected Parcelable onSaveInstanceState() { SavedStateDI st = new SavedStateDI(super.onSaveInstanceState()); st.day = etD.getText().toString(); st.month = etM.getText().toString(); st.year = etY.getText().toString(); return st; } @Override protected void onRestoreInstanceState(Parcelable state) { if (state == null || !(state instanceof SavedStateDI)) { super.onRestoreInstanceState(state); return; } SavedStateDI ss = (SavedStateDI) state; super.onRestoreInstanceState(ss.getSuperState()); etD.setText(ss.day); etM.setText(ss.month); etY.setText(ss.year); }; }