Первая
This commit is contained in:
246
app/src/main/java/dbfields/AutoCompleteTextViewDB.java
Normal file
246
app/src/main/java/dbfields/AutoCompleteTextViewDB.java
Normal file
@ -0,0 +1,246 @@
|
||||
package dbfields;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.text.InputType;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.AutoCompleteTextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import kz.istt.locust.DbOpenHelper;
|
||||
import kz.istt.locust.LocustActivity;
|
||||
import kz.istt.locust.R;
|
||||
|
||||
import static android.widget.AdapterView.INVALID_POSITION;
|
||||
|
||||
public class AutoCompleteTextViewDB extends AutoCompleteTextView implements selectDB {
|
||||
private String m_Value = null;
|
||||
private List<String> m_lName = new ArrayList<String>(); //Заголовки
|
||||
private List<String> m_lVal = new ArrayList<String>(); //Значения
|
||||
public ArrayAdapter<String> dataAdapter = null;
|
||||
private Context m_context = null;
|
||||
|
||||
private List<OnClickListener> m_lChange = new ArrayList<OnClickListener>(); //Слушатели изменений
|
||||
|
||||
/*private AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
|
||||
if (getSelectedItemPosition() != INVALID_POSITION && position != INVALID_POSITION)
|
||||
AutoCompleteTextViewDB.this.setValue(m_lVal.get(getSelectedItemPosition()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> parentView) {
|
||||
}
|
||||
};*/
|
||||
|
||||
private AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
int pos=getSelectedItemPosition();
|
||||
String val=m_lVal.get(pos);
|
||||
AutoCompleteTextViewDB.this.setValue(val);
|
||||
}
|
||||
};
|
||||
|
||||
int getSelectedItemPosition() {
|
||||
String str = this.getText().toString();
|
||||
int pos=INVALID_POSITION;
|
||||
for(int i=0; i<m_lName.size();i++)
|
||||
{
|
||||
if(str.equals(m_lName.get(i).toString())) {
|
||||
pos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
/**
|
||||
* Добавить слушателя смены значения (не клика)
|
||||
* @param listener
|
||||
*/
|
||||
public void addOnChangeValueListener(OnClickListener listener)
|
||||
{
|
||||
m_lChange.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Удалить слушателя смены значений
|
||||
* @param listener
|
||||
*/
|
||||
public void remOnChangeValueListener(OnClickListener listener)
|
||||
{
|
||||
m_lChange.remove(listener);
|
||||
}
|
||||
|
||||
/*Консткукто*/
|
||||
public AutoCompleteTextViewDB(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context,attrs);
|
||||
m_context=context;
|
||||
//setOnItemSelectedListener(listener);
|
||||
setOnItemClickListener(listener);
|
||||
setInputType(InputType.TYPE_NULL); //Disable writing to field
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить значение
|
||||
*/
|
||||
public String getValue()
|
||||
{
|
||||
return m_Value;
|
||||
}
|
||||
|
||||
/** Присвоить значение полю и попытаться найти его в выподающем списке*/
|
||||
public void setValue(String value)
|
||||
{
|
||||
if(m_Value == value) return;
|
||||
m_Value = value;
|
||||
|
||||
updatePosition();
|
||||
|
||||
//Информируем слушателей о изменении значении
|
||||
for(int i=0;i<m_lChange.size();i++)
|
||||
{ m_lChange.get(i).onClick(this);
|
||||
}
|
||||
}
|
||||
|
||||
/*public String getText(){
|
||||
//
|
||||
}*/
|
||||
|
||||
public void addField(String name, String val)
|
||||
{
|
||||
m_lName.add(name);
|
||||
m_lVal.add(val);
|
||||
|
||||
//Обновляем список
|
||||
//setOnItemSelectedListener(null); //Чтоб событие не сработало
|
||||
setOnItemClickListener(null);
|
||||
dataAdapter = new ArrayAdapter<String>(m_context, R.layout.dropdown_item, m_lName);
|
||||
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
this.setAdapter(dataAdapter);
|
||||
//setOnItemSelectedListener(listener);
|
||||
setOnItemClickListener(listener);
|
||||
|
||||
updatePosition(); //Чтоб установилось на существующее значение если оно есть
|
||||
}
|
||||
|
||||
public void clearFields()
|
||||
{
|
||||
m_lName.clear();
|
||||
m_lVal.clear();
|
||||
|
||||
//Обновляем список
|
||||
//setOnItemSelectedListener(null);
|
||||
setOnItemClickListener(null);
|
||||
dataAdapter = new ArrayAdapter<String>(m_context, R.layout.dropdown_item, m_lName);
|
||||
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
this.setAdapter(dataAdapter);
|
||||
//setOnItemSelectedListener(listener);
|
||||
setOnItemClickListener(listener);
|
||||
}
|
||||
|
||||
public void updateAdapter(Context context){
|
||||
//Обновляем список
|
||||
setOnItemClickListener(null);
|
||||
dataAdapter = new ArrayAdapter<String>(context, R.layout.dropdown_item, m_lName);
|
||||
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
this.setAdapter(dataAdapter);
|
||||
setOnItemClickListener(listener);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Обновить позицию вып списка в соответствии со значением
|
||||
*/
|
||||
public void updatePosition()
|
||||
{
|
||||
Boolean b=true;
|
||||
for(int i=0;i<m_lVal.size();i++)
|
||||
{
|
||||
if(m_lVal.get(i).equals(m_Value))
|
||||
{
|
||||
setText(m_lName.get(i)); //setSelection(i);
|
||||
b=false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(b) setText(""); //setSelection(INVALID_POSITION);
|
||||
|
||||
updateAdapter(m_context);
|
||||
}
|
||||
|
||||
public void setOnChangeValueListener(View.OnClickListener listener){
|
||||
this.addOnChangeValueListener(listener);
|
||||
}
|
||||
/*
|
||||
// Класс для сохранения изменений сделаных пользователем при повороте экрана
|
||||
public static class SavedState extends BaseSavedState
|
||||
{
|
||||
String value = ""; //Не может быть null почемуто вылетает!
|
||||
|
||||
SavedState(Parcelable superState)
|
||||
{
|
||||
super(superState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel out, int flags)
|
||||
{
|
||||
super.writeToParcel(out, flags);
|
||||
out.writeString(value);
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>()
|
||||
{
|
||||
public SavedState createFromParcel(Parcel in)
|
||||
{
|
||||
return new SavedState(in);
|
||||
}
|
||||
|
||||
public SavedState[] newArray(int size)
|
||||
{
|
||||
return new SavedState[size];
|
||||
}
|
||||
};
|
||||
|
||||
private SavedState(Parcel in)
|
||||
{
|
||||
super(in);
|
||||
value = in.readString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Parcelable onSaveInstanceState()
|
||||
{
|
||||
SavedState st = new SavedState(super.onSaveInstanceState());
|
||||
st.value = getValue();
|
||||
if(st.value==null) st.value="";
|
||||
return st;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRestoreInstanceState(Parcelable state)
|
||||
{
|
||||
if (state == null || !(state instanceof SavedState))
|
||||
{
|
||||
super.onRestoreInstanceState(state);
|
||||
return;
|
||||
}
|
||||
|
||||
SavedState ss = (SavedState) state;
|
||||
super.onRestoreInstanceState(ss.getSuperState());
|
||||
setValue(ss.value);
|
||||
};
|
||||
*/
|
||||
}
|
||||
246
app/src/main/java/dbfields/DateInput.java
Normal file
246
app/src/main/java/dbfields/DateInput.java
Normal file
@ -0,0 +1,246 @@
|
||||
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<SavedStateDI> CREATOR = new Parcelable.Creator<SavedStateDI>()
|
||||
{
|
||||
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);
|
||||
};
|
||||
|
||||
}
|
||||
109
app/src/main/java/dbfields/DateTimeTM.java
Normal file
109
app/src/main/java/dbfields/DateTimeTM.java
Normal file
@ -0,0 +1,109 @@
|
||||
package dbfields;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.EditText;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
public class DateTimeTM extends com.google.android.material.textfield.TextInputEditText implements fieldDB
|
||||
{
|
||||
private String m_Value = null;
|
||||
|
||||
public DateTimeTM(Context context)
|
||||
{
|
||||
super(context);
|
||||
}
|
||||
public DateTimeTM(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context,attrs);
|
||||
}
|
||||
|
||||
public String getValue(){
|
||||
return m_Value;
|
||||
}
|
||||
|
||||
//Передаётся в секундах с 1970 года по гринвичу но отображается в локальном времени 1579154400 отображается 16.01.2020 12:00 (в Алмате)
|
||||
public void setValue(String val)
|
||||
{
|
||||
m_Value = val;
|
||||
if(val!=null && !val.equals(""))
|
||||
{
|
||||
Date date = new Date(Long.parseLong(m_Value)*1000);
|
||||
|
||||
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm");
|
||||
//format.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
|
||||
String str = format.format(date);
|
||||
setText(str);
|
||||
}else
|
||||
{
|
||||
setText("");
|
||||
}
|
||||
}
|
||||
|
||||
// Класс для сохранения изменений сделаных пользователем при повороте экрана
|
||||
public static class SavedStateTDTM extends BaseSavedState
|
||||
{
|
||||
String value = ""; //Не может быть null почемуто вылетает!
|
||||
|
||||
SavedStateTDTM(Parcelable superState)
|
||||
{
|
||||
super(superState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel out, int flags)
|
||||
{
|
||||
super.writeToParcel(out, flags);
|
||||
out.writeString(value);
|
||||
}
|
||||
|
||||
public static final Creator<SavedStateTDTM> CREATOR = new Creator<SavedStateTDTM>()
|
||||
{
|
||||
public SavedStateTDTM createFromParcel(Parcel in)
|
||||
{
|
||||
return new SavedStateTDTM(in);
|
||||
}
|
||||
|
||||
public SavedStateTDTM[] newArray(int size)
|
||||
{
|
||||
return new SavedStateTDTM[size];
|
||||
}
|
||||
};
|
||||
|
||||
private SavedStateTDTM(Parcel in)
|
||||
{
|
||||
super(in);
|
||||
value = in.readString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Parcelable onSaveInstanceState()
|
||||
{
|
||||
SavedStateTDTM st = new SavedStateTDTM(super.onSaveInstanceState());
|
||||
st.value = getValue();
|
||||
if(st.value==null) st.value="";
|
||||
return st;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRestoreInstanceState(Parcelable state)
|
||||
{
|
||||
if (state == null || !(state instanceof SavedStateTDTM))
|
||||
{
|
||||
super.onRestoreInstanceState(state);
|
||||
return;
|
||||
}
|
||||
|
||||
SavedStateTDTM ss = (SavedStateTDTM) state;
|
||||
super.onRestoreInstanceState(ss.getSuperState());
|
||||
setValue(ss.value);
|
||||
};
|
||||
|
||||
}
|
||||
110
app/src/main/java/dbfields/DateTimeText.java
Normal file
110
app/src/main/java/dbfields/DateTimeText.java
Normal file
@ -0,0 +1,110 @@
|
||||
package dbfields;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.EditText;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
public class DateTimeText extends EditText implements fieldDB
|
||||
{
|
||||
private String m_Value = null;
|
||||
|
||||
public DateTimeText(Context context)
|
||||
{
|
||||
super(context);
|
||||
}
|
||||
public DateTimeText(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context,attrs);
|
||||
}
|
||||
|
||||
public String getValue(){
|
||||
return m_Value;
|
||||
}
|
||||
|
||||
//Передаётся в секундах с 1970 года по гринвичу но отображается в локальном времени 1579154400 отображается 16.01.2020 12:00 (в Алмате)
|
||||
public void setValue(String val)
|
||||
{
|
||||
m_Value = val;
|
||||
if(val!=null && !val.equals(""))
|
||||
{
|
||||
Date date = new Date(Long.parseLong(m_Value)*1000);
|
||||
|
||||
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm");
|
||||
//format.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
|
||||
String str = format.format(date);
|
||||
setText(str);
|
||||
}else
|
||||
{
|
||||
setText("");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Класс для сохранения изменений сделаных пользователем при повороте экрана
|
||||
public static class SavedStateDTT extends BaseSavedState
|
||||
{
|
||||
String value = ""; //Не может быть null почемуто вылетает!
|
||||
|
||||
SavedStateDTT(Parcelable superState)
|
||||
{
|
||||
super(superState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel out, int flags)
|
||||
{
|
||||
super.writeToParcel(out, flags);
|
||||
out.writeString(value);
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<SavedStateDTT> CREATOR = new Parcelable.Creator<SavedStateDTT>()
|
||||
{
|
||||
public SavedStateDTT createFromParcel(Parcel in)
|
||||
{
|
||||
return new SavedStateDTT(in);
|
||||
}
|
||||
|
||||
public SavedStateDTT[] newArray(int size)
|
||||
{
|
||||
return new SavedStateDTT[size];
|
||||
}
|
||||
};
|
||||
|
||||
private SavedStateDTT(Parcel in)
|
||||
{
|
||||
super(in);
|
||||
value = in.readString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Parcelable onSaveInstanceState()
|
||||
{
|
||||
SavedStateDTT st = new SavedStateDTT(super.onSaveInstanceState());
|
||||
st.value = getValue();
|
||||
if(st.value==null) st.value="";
|
||||
return st;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRestoreInstanceState(Parcelable state)
|
||||
{
|
||||
if (state == null || !(state instanceof SavedStateDTT))
|
||||
{
|
||||
super.onRestoreInstanceState(state);
|
||||
return;
|
||||
}
|
||||
|
||||
SavedStateDTT ss = (SavedStateDTT) state;
|
||||
super.onRestoreInstanceState(ss.getSuperState());
|
||||
setValue(ss.value);
|
||||
};
|
||||
|
||||
}
|
||||
33
app/src/main/java/dbfields/InputFilterMinMax.java
Normal file
33
app/src/main/java/dbfields/InputFilterMinMax.java
Normal file
@ -0,0 +1,33 @@
|
||||
package dbfields;
|
||||
|
||||
import android.text.InputFilter;
|
||||
import android.text.Spanned;
|
||||
|
||||
public class InputFilterMinMax implements InputFilter {
|
||||
|
||||
private int min, max;
|
||||
|
||||
public InputFilterMinMax(int min, int max) {
|
||||
this.min = min;
|
||||
this.max = max;
|
||||
}
|
||||
|
||||
public InputFilterMinMax(String min, String max) {
|
||||
this.min = Integer.parseInt(min);
|
||||
this.max = Integer.parseInt(max);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
|
||||
try {
|
||||
int input = Integer.parseInt(dest.toString() + source.toString());
|
||||
if (isInRange(min, max, input))
|
||||
return null;
|
||||
} catch (NumberFormatException nfe) { }
|
||||
return "";
|
||||
}
|
||||
|
||||
private boolean isInRange(int a, int b, int c) {
|
||||
return b > a ? c >= a && c <= b : c >= b && c <= a;
|
||||
}
|
||||
}
|
||||
213
app/src/main/java/dbfields/SpinnerDB.java
Normal file
213
app/src/main/java/dbfields/SpinnerDB.java
Normal file
@ -0,0 +1,213 @@
|
||||
package dbfields;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.text.Editable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Spinner;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SpinnerDB extends Spinner implements selectDB
|
||||
{
|
||||
private String m_Value = null;
|
||||
private List<String> m_lName = new ArrayList<String>(); //Заголовки
|
||||
private List<String> m_lVal = new ArrayList<String>(); //Значения
|
||||
private Context m_context = null;
|
||||
|
||||
private List<OnClickListener> m_lChange = new ArrayList<OnClickListener>(); //Слушатели изменений
|
||||
|
||||
private OnItemSelectedListener listener = new OnItemSelectedListener()
|
||||
{
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
|
||||
{
|
||||
if(getSelectedItemPosition()!=INVALID_POSITION && position != INVALID_POSITION)
|
||||
SpinnerDB.this.setValue(m_lVal.get(getSelectedItemPosition()));
|
||||
}
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> parentView)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Добавить слушателя смены значения (не клика)
|
||||
* @param listener
|
||||
*/
|
||||
public void addOnChangeValueListener(OnClickListener listener)
|
||||
{
|
||||
m_lChange.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Удалить слушателя смены значений
|
||||
* @param listener
|
||||
*/
|
||||
public void remOnChangeValueListener(OnClickListener listener)
|
||||
{
|
||||
m_lChange.remove(listener);
|
||||
}
|
||||
|
||||
public SpinnerDB(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context,attrs);
|
||||
m_context = context;
|
||||
setOnItemSelectedListener(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить значение
|
||||
*/
|
||||
public String getValue()
|
||||
{
|
||||
return m_Value;
|
||||
}
|
||||
|
||||
/** Присвоить значение полю и попытаться найти его в выподающем списке*/
|
||||
public void setValue(String value)
|
||||
{
|
||||
if(m_Value == value) return;
|
||||
m_Value = value;
|
||||
|
||||
updatePosition();
|
||||
|
||||
//Информируем слушателей о изменении значении
|
||||
for(int i=0;i<m_lChange.size();i++)
|
||||
{ m_lChange.get(i).onClick(getEmptyView());
|
||||
}
|
||||
}
|
||||
|
||||
public void addField(String name, String val)
|
||||
{
|
||||
m_lName.add(name);
|
||||
m_lVal.add(val);
|
||||
|
||||
//Обновляем список
|
||||
setOnItemSelectedListener(null); //Чтоб событие не сработало
|
||||
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(m_context, android.R.layout.simple_spinner_item, m_lName);
|
||||
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
this.setAdapter(dataAdapter);
|
||||
setOnItemSelectedListener(listener);
|
||||
|
||||
updatePosition(); //Чтоб установилось на существующее значение если оно есть
|
||||
}
|
||||
|
||||
public void clearFields()
|
||||
{
|
||||
m_lName.clear();
|
||||
m_lVal.clear();
|
||||
|
||||
//Обновляем список
|
||||
setOnItemSelectedListener(null);
|
||||
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(m_context, android.R.layout.simple_spinner_item, m_lName);
|
||||
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
this.setAdapter(dataAdapter);
|
||||
setOnItemSelectedListener(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Обновить позицию вып списка в соответствии со значением
|
||||
*/
|
||||
protected void updatePosition()
|
||||
{
|
||||
Boolean b=true;
|
||||
for(int i=0;i<m_lVal.size();i++)
|
||||
{
|
||||
if(m_lVal.get(i).equals(m_Value))
|
||||
{
|
||||
setSelection(i);
|
||||
b=false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(b) setSelection(INVALID_POSITION);
|
||||
}
|
||||
|
||||
// Return the currently selected title (not a value)
|
||||
public Editable getText(){
|
||||
String result="";
|
||||
for(int i=0;i<m_lVal.size();i++)
|
||||
{
|
||||
if(m_lVal.get(i).equals(m_Value))
|
||||
{
|
||||
result=m_lName.get(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return new SpannableStringBuilder(result);
|
||||
}
|
||||
|
||||
public void setOnChangeValueListener(View.OnClickListener listener){
|
||||
this.addOnChangeValueListener(listener);
|
||||
}
|
||||
|
||||
// Класс для сохранения изменений сделаных пользователем при повороте экрана
|
||||
public static class SavedStateSPNR extends BaseSavedState
|
||||
{
|
||||
String value = ""; //Не может быть null почемуто вылетает!
|
||||
|
||||
SavedStateSPNR(Parcelable superState)
|
||||
{
|
||||
super(superState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel out, int flags)
|
||||
{
|
||||
super.writeToParcel(out, flags);
|
||||
out.writeString(value);
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<SavedStateSPNR> CREATOR = new Parcelable.Creator<SavedStateSPNR>()
|
||||
{
|
||||
public SavedStateSPNR createFromParcel(Parcel in)
|
||||
{
|
||||
return new SavedStateSPNR(in);
|
||||
}
|
||||
|
||||
public SavedStateSPNR[] newArray(int size)
|
||||
{
|
||||
return new SavedStateSPNR[size];
|
||||
}
|
||||
};
|
||||
|
||||
private SavedStateSPNR(Parcel in)
|
||||
{
|
||||
super(in);
|
||||
value = in.readString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Parcelable onSaveInstanceState()
|
||||
{
|
||||
SavedStateSPNR st = new SavedStateSPNR(super.onSaveInstanceState());
|
||||
st.value = getValue();
|
||||
if(st.value==null) st.value="";
|
||||
return st;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRestoreInstanceState(Parcelable state)
|
||||
{
|
||||
if (state == null || !(state instanceof SavedStateSPNR))
|
||||
{
|
||||
super.onRestoreInstanceState(state);
|
||||
return;
|
||||
}
|
||||
|
||||
SavedStateSPNR ss = (SavedStateSPNR) state;
|
||||
super.onRestoreInstanceState(ss.getSuperState());
|
||||
setValue(ss.value);
|
||||
};
|
||||
|
||||
}
|
||||
27
app/src/main/java/dbfields/StringDB.java
Normal file
27
app/src/main/java/dbfields/StringDB.java
Normal file
@ -0,0 +1,27 @@
|
||||
package dbfields;
|
||||
|
||||
public class StringDB implements fieldDB
|
||||
{
|
||||
|
||||
private String value;
|
||||
|
||||
public StringDB(String val)
|
||||
{
|
||||
value = val;
|
||||
}
|
||||
|
||||
public StringDB(){}
|
||||
|
||||
@Override
|
||||
public String getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(String val)
|
||||
{
|
||||
value=val;
|
||||
}
|
||||
|
||||
}
|
||||
33
app/src/main/java/dbfields/TextViewHTML.java
Normal file
33
app/src/main/java/dbfields/TextViewHTML.java
Normal file
@ -0,0 +1,33 @@
|
||||
package dbfields;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.Html;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class TextViewHTML extends TextView
|
||||
{
|
||||
public TextViewHTML(Context context, AttributeSet attrs, int defStyleAttr)
|
||||
{
|
||||
super(context, attrs, defStyleAttr);
|
||||
init();
|
||||
}
|
||||
|
||||
public TextViewHTML(Context context)
|
||||
{
|
||||
super(context);
|
||||
init();
|
||||
}
|
||||
|
||||
public TextViewHTML(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
init();
|
||||
}
|
||||
|
||||
private void init()
|
||||
{
|
||||
setText(Html.fromHtml(getText().toString()));
|
||||
}
|
||||
|
||||
}
|
||||
151
app/src/main/java/dbfields/TimeInput.java
Normal file
151
app/src/main/java/dbfields/TimeInput.java
Normal file
@ -0,0 +1,151 @@
|
||||
package dbfields;
|
||||
|
||||
import android.content.Context;
|
||||
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 java.util.TimeZone;
|
||||
|
||||
import kz.istt.locust.R;
|
||||
|
||||
public class TimeInput extends LinearLayout {
|
||||
|
||||
private EditText etH = null;
|
||||
private TextView tv1 = null;
|
||||
private EditText etM = null;
|
||||
//private EditText etS = null; //Закоментил потому что секунды ненужны
|
||||
|
||||
//Задаёт видимость полей
|
||||
public void setVisibleHMS(String val)
|
||||
{
|
||||
if(val.toLowerCase().indexOf("h")==-1)
|
||||
{
|
||||
if(etH.getParent()!=null)
|
||||
((ViewGroup) etH.getParent()).removeView(etH);
|
||||
if(tv1.getParent()!=null)
|
||||
((ViewGroup) tv1.getParent()).removeView(tv1);
|
||||
} else
|
||||
{
|
||||
if(etH.getParent()==null) addView(etH);
|
||||
if(tv1.getParent()==null) addView(tv1);
|
||||
}
|
||||
|
||||
if(val.toLowerCase().indexOf("m")==-1)
|
||||
{
|
||||
if(etM.getParent()!=null)
|
||||
((ViewGroup) etM.getParent()).removeView(etM);
|
||||
if(tv1.getParent()!=null)
|
||||
((ViewGroup) tv1.getParent()).removeView(tv1);
|
||||
} else
|
||||
{
|
||||
if(etM.getParent()==null) addView(etM);
|
||||
if(tv1.getParent()==null) addView(tv1);
|
||||
}
|
||||
}
|
||||
|
||||
public TimeInput(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;
|
||||
|
||||
etH = new EditText(context);
|
||||
|
||||
etH.setHint(context.getResources().getString(R.string.Hours));
|
||||
etH.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
etH.setFilters(new InputFilter[] {new InputFilter.LengthFilter(4)}); //Почему-то не работает…
|
||||
etH.setMaxEms(10);
|
||||
etH.setFilters(fArray);
|
||||
addView(etH,paramMessage);
|
||||
|
||||
tv1 = new TextView(context);
|
||||
tv1.setText(":");
|
||||
addView(tv1);
|
||||
|
||||
etM = new EditText(context);
|
||||
etM.setHint(context.getResources().getString(R.string.Minutes));
|
||||
etM.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
etM.setFilters(new InputFilter[] {new InputFilter.LengthFilter(4)}); //Почему-то не работает…
|
||||
etM.setMaxEms(10);
|
||||
etM.setFilters(fArray);
|
||||
addView(etM/*,paramMessage*/);
|
||||
/*
|
||||
tv = new TextView(context);
|
||||
tv.setText(":");
|
||||
addView(tv);
|
||||
|
||||
etS = new EditText(context);
|
||||
etS.setHint(context.getResources().getString(R.string.Seconds));
|
||||
etS.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
etS.setFilters(new InputFilter[] {new InputFilter.LengthFilter(4)}); //Почему-то не работает…
|
||||
etS.setMaxEms(10);
|
||||
etS.setFilters(fArray);
|
||||
addView(etS,paramMessage);
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Секунд с начала дня
|
||||
*/
|
||||
public void setTime(Long time)
|
||||
{
|
||||
if(time == null) setTime((Date)null);
|
||||
else setTime(new Date(time * 1000L));
|
||||
}
|
||||
|
||||
public void setTime(Date time)
|
||||
{
|
||||
if(time == null)
|
||||
{
|
||||
etH.setText("");
|
||||
etM.setText("");
|
||||
//etS.setText("");
|
||||
}else
|
||||
{
|
||||
etH.setText(new SimpleDateFormat("HH").format(time));
|
||||
etM.setText(new SimpleDateFormat("mm").format(time));
|
||||
//etS.setText(new SimpleDateFormat("ss").format(time));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить секунд с начала дня по гринвичу с учётом временой зоны
|
||||
* @return
|
||||
*/
|
||||
public Long getTime()
|
||||
{
|
||||
Date d=null;
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||||
sdf.setTimeZone(TimeZone.getDefault());
|
||||
try
|
||||
{
|
||||
//d = sdf.parse(etH.getText().toString()+":"+etM.getText().toString()+":"+etS.getText().toString());
|
||||
String h = etH.getText().toString();
|
||||
if(h=="") h="00";
|
||||
|
||||
String m = etM.getText().toString();
|
||||
if(m=="") m="00";
|
||||
//String s = etS.getText().toString();
|
||||
//if(s=="") s="00";
|
||||
|
||||
d = sdf.parse(h+":"+m+":00");
|
||||
} catch (ParseException e) {
|
||||
return null;
|
||||
}
|
||||
return d.getTime() / 1000L;
|
||||
}
|
||||
}
|
||||
13
app/src/main/java/dbfields/fieldDB.java
Normal file
13
app/src/main/java/dbfields/fieldDB.java
Normal file
@ -0,0 +1,13 @@
|
||||
package dbfields;
|
||||
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import kz.istt.locust.LocustActivity;
|
||||
|
||||
public interface fieldDB
|
||||
{
|
||||
public String getValue();
|
||||
public void setValue(String val);
|
||||
}
|
||||
|
||||
13
app/src/main/java/dbfields/selectDB.java
Normal file
13
app/src/main/java/dbfields/selectDB.java
Normal file
@ -0,0 +1,13 @@
|
||||
package dbfields;
|
||||
|
||||
import android.text.Editable;
|
||||
import android.view.View;
|
||||
|
||||
import dbfields.fieldDB;
|
||||
|
||||
public interface selectDB extends fieldDB {
|
||||
public void addField(String name, String val);
|
||||
public void clearFields(); //Clear all fields from drop down list
|
||||
public Editable getText();
|
||||
public void setOnChangeValueListener(View.OnClickListener listener);
|
||||
}
|
||||
Reference in New Issue
Block a user