Поймать, произошло ли onFocusChange при изменении ориентации в Android - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь расширить представление 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;
        }
    };

}

Ценю любые комментарии / отзывы / предложения.

...