Я пытаюсь расширить представление TextInputEditText и создать представление DateTimeInputEditText, которое показывает диалоги DatePicker и TimePicker onFocus.Тем не менее, при переходе от портрета к ландшафту кажется, что onFocusChange также срабатывает, что приводит к ненужному повторному отображению диалогов.
Я не устанавливаю для focusable и focusableOnTouchMode значение false, так как мне нужны представления дляполучить выделение (на основе secondColor) при фокусировке.
Вот код ниже.
DateTimeInputEditText.java
import android.content.Context;
import android.content.DialogInterface;
import android.os.Build;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TimePicker;
import androidx.appcompat.app.AlertDialog;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
public class DateTimeInputEditText extends ReadOnlyEditText {
private DatePicker datePicker;
private AlertDialog datePickerDialog;
private TimePicker timePicker;
private AlertDialog timePickerDialog;
private Calendar calendar;
public DateTimeInputEditText(Context context) {
super(context);
init(context, null, 0);
}
public DateTimeInputEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public DateTimeInputEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
protected void init(Context context, AttributeSet attrs, int defStyleAttr) {
super.init(context, attrs, defStyleAttr);
calendar = Calendar.getInstance();
timePicker = new TimePicker(context);
timePickerDialog = new AlertDialog.Builder(context)
.setView(timePicker)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (Build.VERSION.SDK_INT >= 24) {
calendar.set(Calendar.HOUR_OF_DAY, timePicker.getHour());
calendar.set(Calendar.MINUTE, timePicker.getMinute());
} else {
calendar.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
calendar.set(Calendar.MINUTE, timePicker.getCurrentMinute());
}
setText(DateFormat.getDateTimeInstance().format(calendar.getTime()));
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
})
.create();
datePicker = new DatePicker(context);
datePickerDialog = new AlertDialog.Builder(context)
.setView(datePicker)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
calendar.set(Calendar.YEAR, datePicker.getYear());
calendar.set(Calendar.MONTH, datePicker.getMonth());
calendar.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
timePickerDialog.show();
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
})
.create();
setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
datePickerDialog.show();
}
}
});
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
datePickerDialog.show();
}
});
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() > 0) {
try {
DateFormat.getDateTimeInstance().parse(editable.toString());
} catch (ParseException e) {
setText(null);
e.printStackTrace();
}
}
}
});
}
}
ReadOnlyEditText.java
import android.content.Context;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.mypackage.support.R;
import com.google.android.material.textfield.TextInputEditText;
public class ReadOnlyEditText extends TextInputEditText {
public ReadOnlyEditText(Context context) {
super(context);
}
public ReadOnlyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ReadOnlyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
protected void init(Context context, AttributeSet attrs, int defStyleAttr) {
setCursorVisible(false);
setInputType(InputType.TYPE_NULL);
//setFocusable(false);
//setFocusableInTouchMode(false);
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (charSequence.length() > 0) {
setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_clear_black_24dp, 0);
setOnTouchListener(onTouchListener);
} else {
setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
setOnTouchListener(null);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
private OnTouchListener onTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
final int DRAWABLE_LEFT = 0;
final int DRAWABLE_TOP = 1;
final int DRAWABLE_RIGHT = 2;
final int DRAWABLE_BOTTOM = 3;
if(motionEvent.getAction() == MotionEvent.ACTION_UP) {
if(motionEvent.getRawX() >= (getRight() - getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
setText(null);
return true;
}
}
return false;
}
};
}
Ценю любые комментарии / отзывы / предложения.