我有一个PreferenceScreen,其中3个首选项是TimePreferencesTimePreference是扩展DialogPreference的自定义类,它包含一个TimePicker。我在THIS CODE之后创建了它。

现在我想限制TimePicker输入。每个TimePreference需要有一个特定的时间限制(此限制在每个TimePreference中将有所不同),我将使用此限制来检查输入值。即,我可能希望第一个TimePreference小于1小时,第二个小于5小时,最后一个没有限制。

由于我想避免使用3个不同的类,因此我一直在寻找一种将数据发送到首选项的方法。我尝试使用defaultValue,但是当用户已经选择任何值时,它为null。

我的PreferenceActivity使用PreferenceFragment。这是他们的代码:

public class PrefsActivity extends Activity {

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getFragmentManager().beginTransaction().replace(android.R.id.content,
            new PrefsFragment()).commit();
}

}

public class PrefsFragment extends PreferenceFragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.prefs_tod);
}

}


我可以将此数据发送到首选项吗?还是我应该有3个不同的班级?

谢谢!

最佳答案

您可以使用limit属性创建具有其他属性的自定义首选项。

res / values / attrs.xml

<declare-styleable name="CustomPreference">
    <attr name="limit" format="integer"/>
</declare-styleable>


CustomPreference.java

public class CustomPreference extends DialogPreference {
private int limit;

public CustomPreference(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomPreference, 0, 0);
    limit = a.getInteger(R.styleable.CustomPreference_limit, 0);

    a.recycle();
}


在首选项布局中:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res/com.example.package">
    <PreferenceCategory>
        <com.example.package.CustomPreference
        android:key="@string/pref_key"
            android:title="@string/pref_title"
            app:limit="6" />
    </PreferenceCategory>
</PreferenceScreen>


您也可以通过编程设置属性值

10-08 13:14