Я новичок в студии 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);
}
}