DialogFragment timepicker onCancel и onDismiss проблема - PullRequest
0 голосов
/ 06 марта 2020

Я пытался реализовать Time Picker, который открывается SwitchCompat, поэтому, когда я включаю опцию, Time Picker появляется, он работает нормально, но если я нажимаю кнопку отмены, или кнопку назад, или просто нажимаю за пределами переключатель времени остается в положении ON, и я хочу, чтобы он снова переключился в положение OFF, если я не выбрал время в Time Picker. Подумал, что, возможно, метод onCancel может помочь, но это не так, или просто я допустил некоторую ошибку с его реализацией, есть связанный код:

public class Settings extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener, TimePickerDialog.OnDismissListener, TimePickerDialog.OnCancelListener {
    private EditText textLastHour;
    private KeyListener keyListener;
    private SwitchCompat hourSwitch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        textLastHour = findViewById(R.id.finalHourText);
        textLastHour.setKeyListener(null);
        textLastHour.setHint("Option not selected");

        hourSwitch = findViewById(R.id.switch_hour);

        hourSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    DialogFragment timePicker = new TimePickerFragment();
                    timePicker.show(getSupportFragmentManager(), "time picker");

                } else {
                    textLastHour.setText("");
                }
            }
        });
    }


    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        textLastHour = findViewById(R.id.finalHourText);
        textLastHour.setText("Final alarm at: " + hourOfDay + ":" + minute);
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        hourSwitch.setChecked(false);
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        hourSwitch.setChecked(false);
    }
}

Я пробовал оба onDismiss и onCancel, и ни сработало ли здесь, есть ли какое-нибудь решение вернуть Switch go в исходное положение, если вы отмените Time Picker? Добавил DatePicker к тегам, так как я чувствую, что у этой проблемы может быть то же решение, что и TimePicker.

My TimePickerFragment Класс:

public class TimePickerFragment extends DialogFragment {

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        return new TimePickerDialog(getActivity(), (TimePickerDialog.OnTimeSetListener) getActivity(), hour, minute, DateFormat.is24HourFormat(getActivity()));
    }
}

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Это на самом деле проще, чем я думал, все что вам нужно сделать, это добавить слушателя dismiss и соответственно изменить свой пользовательский интерфейс / logi c

TimePickerDialog dialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

    }
}, 10, 10, true);

dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        Toast.makeText(MainActivity.this, "dismissed", Toast.LENGTH_LONG).show();
    }
});

dialog.show();

Вы можете использовать стандартный TimePickerDialog

Редактировать: Поместите все в onCreate(), кроме dialog.show(), dialog.show() переходит в ifChecked в коммутаторе

0 голосов
/ 06 марта 2020

Как я вижу в вашем коде, вы не определили слушателя в своем классе TimePickerFragment. Вы можете добавить следующий код в свой TimePickerFragment:

public  class TimePickerFragment(Context context) extends DialogFragment{

    interface OnCompleteListener {
        abstract void onComplete(boolean suceeded);
    }

    OnCompleteListener listener;

    /**

    * your other lines of code

    **/
}

Не забудьте установить аргумент контекста для вашего класса! Затем переопределите функцию onAttach и внутри, которые реализуют ваш слушатель, следующим образом:

try {
            this.listener = (OnCompleteListener) context;

        } catch (ClassCastException e) {

            throw ClassCastException(activity.toString() + " must implement OnCompleteListener");

        }

После этого в переопределении onDismiss () и установите listener.onComplete(false); внутри него. И всякий раз, когда TimePickerFragment хотел завершить sh успешно, просто установите listener.onComplete(true); Теперь вернемся к MainActivity. Прежде всего, заставьте MainActivity реализовать TimePickerFragment.OnCompleteListener. Теперь вам нужно переопределить абстрактную функцию вашего OnCompleteListener. Просто, если аргумент был ложным, это означает, что диалог закрывается безуспешно, поэтому при простом условии if вы устанавливаете Switch программно. Надеюсь, что смогу помочь.

...