Невозможно использовать DialogPreference с androidx - PullRequest
0 голосов
/ 29 июня 2019

Я новичок в студии android и пытаюсь сделать простое приложение для todolist.У меня настроен ежедневный будильник с помощью Alarm Manager, но я бы хотел, чтобы пользователь мог изменить время срабатывания этого ежедневного будильника на странице настроек.Поэтому мне нужен таймер на экране настроек, и я узнал, что вы можете сделать это с помощью пользовательских DialogPreferences.

Я пытался следовать этому руководству http://www.infiniteimprob.com/blog/custom-preferences/, но оно показывает это исключение com.example.todolist.TimePickerPreference cannot be cast to androidx.preference.Preference У меня такое ощущение, что это связано с проблемами совместимости, поскольку я использовал библиотеку androidx для других своих операций импорта.Я думаю, что это будет решено, если я импортирую androidx.preference.DialogPreference вместо android.preference.DialogPreference; Может кто-нибудь сказать мне, как я могу сделать это изменение?Я прочитал этот ответ Разница между DialogPreference до и после AndroidX , но я до сих пор не знаю, как его выполнить.

Это мой класс timepickerpreference, как указано на сайте:

import android.content.res.TypedArray;
import android.os.Build;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import android.widget.TimePicker;

public class TimePickerPreference extends DialogPreference {

    private static final int DEFAULT_TIME = 0;
    private TimePicker mTimePicker;
    private int currentTime;

    public TimePickerPreference(Context context, AttributeSet attrs){
        super(context, attrs);
        setDialogLayoutResource(R.layout.timepickerpreferencelayout);
        setPositiveButtonText("ok");
        setNegativeButtonText("cancel");
    }

    private static int getTime(int hour, int minute){
        return hour*60*60*1000 + minute*60*1000;
    }

    private static int getHour(int value){
        return (int)(value / (60*60*1000));
    }

    private static int getMinute(int value){
        return (int)(value % (60*60*1000));
    }

    @Override
    protected View onCreateDialogView() {
        View view = super.onCreateDialogView();
        mTimePicker = (TimePicker) view.findViewById(R.id.timePicker);
        mTimePicker.setIs24HourView(true);
        if (Build.VERSION.SDK_INT >= 23)
        {
            mTimePicker.setHour(getHour(currentTime));
            mTimePicker.setMinute(getMinute(currentTime));
        }
        else
        {
            mTimePicker.setCurrentHour(getHour(currentTime));
            mTimePicker.setCurrentMinute(getMinute(currentTime));
        }

        mTimePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener()
        {
            @Override
            public void onTimeChanged(TimePicker timePicker, int hour, int minute)
            {
                TimePickerPreference.this.currentTime = getTime(hour, minute);
            }
        });

        TextView messageTextView = (TextView) view.findViewById(R.id.messageTextView);
        if (getDialogMessage() == null || getDialogMessage().toString().trim().length() == 0)
            messageTextView.setVisibility(View.GONE);
        messageTextView.setText(getDialogMessage());

        return view;
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index)
    {
        return a.getInt(index, DEFAULT_TIME);
    }

    @Override
    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue)
    {
        if(restorePersistedValue)
        {
            currentTime = this.getPersistedInt((int) (defaultValue == null ? DEFAULT_TIME : defaultValue));
        }
        else
        {
            currentTime = (int) defaultValue;
            if (shouldPersist())
                persistInt(currentTime);
        }
    }

    @Override
    protected void onDialogClosed(boolean positiveResult)
    {
        if (positiveResult)
            persistInt(currentTime);
    }
}
...