带支持库的Android时间首选项对话框

问题描述 投票:0回答:2

我对使用支持v7或v14库的Android首选项感到困惑。似乎每隔几个月Google就会更改API。

我正在尝试创建一个时间偏好对话框。但是,我当前的一个不支持库。

public class TimePickerPreference : DialogPreference
{
    private int lastHour = 0;
    private int lastMinute = 0;
    private TimePicker picker = null;

    public static int GetHour(string time)
    {
        string[] pieces = time.Split(':');

        return Convert.ToInt32(pieces[0]);
    }

    public static int GetMinute(string time)
    {
        string[] pieces = time.Split(':');

        return Convert.ToInt32(pieces[1]);
    }

    public TimePickerPreference(Context ctxt, IAttributeSet attrs) : base(ctxt, attrs)
    {
    }   

    protected override View OnCreateDialogView()
    {
        picker = new TimePicker(Context);
        picker.SetIs24HourView(Java.Lang.Boolean.True);
        return picker;
    }

    protected override void OnBindDialogView(View v)
    {
        base.OnBindDialogView(v);

        picker.Hour = lastHour;
        picker.Minute = lastMinute;
    }


    protected override void OnDialogClosed(bool positiveResult)
    {
        base.OnDialogClosed(positiveResult);

        if (positiveResult)
        {
            lastHour = picker.Hour;
            lastMinute = picker.Minute;

            string time = lastHour + ":" + lastMinute;
            if (lastMinute.ToString().Length == 1)
                time = lastHour + ":" + "0" + lastMinute;

            if (CallChangeListener(time))
            {
                PersistString(time);
            }

            Title = "שעת תזכורת: " + time;
        }
    }

    protected override Java.Lang.Object OnGetDefaultValue(TypedArray a, int index)
    {
        return a.GetString(index);
    }

    protected override void OnSetInitialValue(bool restorePersistedValue, Java.Lang.Object defaultValue)
    {
        string time = string.Empty;

        if (restorePersistedValue)
        {
            if (defaultValue == null)
            {
                time = GetPersistedString("00:00");
            }
            else
            {
                time = GetPersistedString(defaultValue.ToString());
            }
        }
        else
        {
            time = defaultValue.ToString();
        }

        lastHour = GetHour(time);
        lastMinute = GetMinute(time);
    }
}

DialogPreference在支持库中不存在,而且似乎是PreferenceDialogFragmentPreferenceDialogFragmentCompat,两者的工作方式不同,上面的代码不适用于它们。

我真的对此感到茫然,并且很乐意提供一些帮助。

谢谢!

java android xamarin sharedpreferences android-preferences
2个回答
0
投票

支持库是:

Android支持库提供了许多未内置于框架中的功能。这些库提供了向后兼容的新功能版本,提供了框架中未包含的有用UI元素,并提供了一系列应用程序可以在https://developer.android.com/topic/libraries/support-library/index.html#overview上绘制的实用程序

如果您使用支持库,则必须添加到项目中,但如果您使用DialogPreference中存在的API level 1,您的应用程序将在每个Android设备中运行。

除非需要某些目标sdk中没有的功能,否则不需要使用支持库。

女巫支持我必须使用?取决于您需要的功能和最小sdk:

v4支持库

此库旨在与Android 1.6(API级别4)及更高版本一起使用。与其他库相比,它包括最大的API集,包括对应用程序组件,用户界面功能,可访问性,数据处理,网络连接和编程实用程序的支持。

v7图书馆

有几个库设计用于Android 2.1(API级别7)及更高版本。这些库提供特定的功能集,可以彼此独立地包含在您的应用程序中。

v7 appcompat库

此库添加了对Action Bar用户界面设计模式的支持。

注意:此库取决于v4支持库。如果您使用的是Ant或Eclipse,请确保将v4支持库包含在此库的类路径中。

v13支持库

此库旨在用于Android 3.2(API级别13)及更高版本。它使用(FragmentCompat)类和其他片段支持类添加了对Fragment用户界面模式的支持

https://developer.android.com/topic/libraries/support-library/features.html


0
投票

使用支持库,您需要做一些事情:

时间戳的布局:

<!-- Layout for the TimePreference Dialog -->
<TimePicker
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/time_picker"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="18dp"
    android:paddingTop="18dp" />

读取/写入时间首选项的首选项类:

import android.support.v7.preference.DialogPreference;

public class TimePreference extends DialogPreference {

    private String time;

    public TimePreference(Context context) {
        // Delegate to other constructor
        this(context, null);
    }

    public TimePreference(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.preferenceStyle);
    }

    public TimePreference(Context context, AttributeSet attrs, int defStyleAttr) {
        // Delegate to other constructor
        this(context, attrs, defStyleAttr, defStyleAttr);
    }

    public TimePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

        setPositiveButtonText(R.string.set_value);
        setNegativeButtonText(R.string.cancel);
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;

        // save to SharedPreference
        persistString(time);
    }

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

    @Override
    public int getDialogLayoutResource() {
        return R.layout.pref_dialog_time;
    }

    @Override
    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
        setTime(restorePersistedValue ?
                getPersistedString(time) : (String) defaultValue);
    }

    public static int getHour(String time) {
        String[] pieces = time.split(":");

        return Integer.parseInt(pieces[0]);
    }

    public static int getMinute(String time) {
        String[] pieces = time.split(":");

        return Integer.parseInt(pieces[1]);
    }
}

一个dialogFragment控制你的时间戳的显示:

public class TimePreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat {

    private TimePicker mTimePicker;


    public static TimePreferenceDialogFragmentCompat newInstance(String key) {
        final TimePreferenceDialogFragmentCompat
                fragment = new TimePreferenceDialogFragmentCompat();
        final Bundle b = new Bundle(1);
        b.putString(ARG_KEY, key);
        fragment.setArguments(b);

        return fragment;
    }

    @Override
    protected void onBindDialogView(View view) {
        super.onBindDialogView(view);

        mTimePicker = view.findViewById(R.id.time_picker);

        if (mTimePicker == null) {
            throw new IllegalStateException("Dialog view must contain a TimePicker with id 'time_picker'");
        }

        String time = null;
        DialogPreference preference = getPreference();
        if (preference instanceof TimePreference) {
            time = ((TimePreference) preference).getTime();
        }

        // Set the time to the TimePicker
        if (time != null) {
            mTimePicker.setIs24HourView(DateFormat.is24HourFormat(getContext()));
            mTimePicker.setCurrentHour(TimePreference.getHour(time));
            mTimePicker.setCurrentMinute(TimePreference.getMinute(time));
        }
    }

    @Override
    public void onDialogClosed(boolean positiveResult) {
        if (positiveResult) {
            // Get the current values from the TimePicker
            int hour = mTimePicker.getCurrentHour();
            int minute = mTimePicker.getCurrentMinute();

            // Generate value to save
            String time = hour + ":" + minute;

            DialogPreference preference = getPreference();
            if (preference instanceof TimePreference) {
                TimePreference timePreference = ((TimePreference) preference);
                if (timePreference.callChangeListener(time)) {
                    timePreference.setTime(time);
                }
            }
        }
    }
}

最后你需要一个自定义的PreferenceFragmentCompat:

public class MyPreferenceFragment extends PreferenceFragmentCompat {

    @Override
    public void onDisplayPreferenceDialog(Preference preference) {
        DialogFragment dialogFragment = null;
        if (preference instanceof TimePreference) {
            dialogFragment = TimePreferenceDialogFragmentCompat.newInstance(preference.getKey());
        }


        if (dialogFragment != null) {
            dialogFragment.setTargetFragment(this, 0);
            dialogFragment.show(this.getFragmentManager(), "android.support.v7.preference" +
                    ".PreferenceFragment.DIALOG");
        } else {
            super.onDisplayPreferenceDialog(preference);
        }
    }
}

没有支持库似乎更容易: - /

© www.soinside.com 2019 - 2024. All rights reserved.