问题试图创建一个自定义对话框preference,获取一个时间段 [英] Issues trying to create a custom dialog preference that gets a time period

查看:258
本文介绍了问题试图创建一个自定义对话框preference,获取一个时间段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用preferences在我的UI从用户获取值并填补成一个对象。因此,我不希望坚持他们。我创建了一个自定义的TIMEPERIOD preference得到的时间间隔。

1)为什么我的定制对话框preference数采摘缺少熟悉+ - 控制?此外,它们不允许文本的输入。

2)(在该方法),我应该访问人数采摘收获okay'ed值? onDialogClosed()是为时已晚。它给我的小部件显然是由再丢一空指针错误。

  04-23 13:09:04.732:E / AndroidRuntime(9794):显示java.lang.NullPointerException
04-23 13:09:04.732:E / AndroidRuntime(9794):在com.my preferences.TimePeriod preference.onDialogClosed(TIMEPERIOD preference.java:52)
04-23 13:09:04.732:E / AndroidRuntime(9794):在Android的preference.Dialog preference.onDismiss(对话preference.java:382)。
04-23 13:09:04.732:E / AndroidRuntime(9794):在android.app.Dialog $ ListenersHandler.handleMessage(Dialog.java:1235)

仅供参考,完整code是这里
https://www.dropbox.com/s/pul1eximvsfxsvz/DataManagement$p$pferenceActivity.zip

我遵循的步骤在这里:
http://developer.android.com/guide/topics/ui/settings html的自定义#

和也在这里:
<一href=\"http://stackoverflow.com/questions/4505845/concise-way-of-writing-new-dialog$p$pference-classes\">Concise编写新的对话preference类的方法是什么?

试图把它搬到这里下面的例子<一个href=\"https://github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/cm-10.2/src/com/cyanogenmod/trebuchet/$p$pference/NumberPicker$p$pference.java\"相对=nofollow>这里,也会导致空指针

  @覆盖
受保护的视图onCreateDialogView(){
    hourPicker =(NumberPicker)getDialog()findViewById(R.id.hour_picker)。
    minPicker =(NumberPicker)getDialog()findViewById(R.id.min_picker)。    返回super.onCreateDialogView();
}

请注意缺少的+ - 控制

time_ preference.xml


 &LT;的TextView
    机器人:ID =@ + ID / textView5
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =38dp
    机器人:重力=底
    机器人:文字=提醒每个
    机器人:textAppearance =机器人:ATTR / textAppearanceMedium/&GT;&LT;的LinearLayout
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT&GT;    &LT; NumberPicker
        机器人:ID =@ + ID / hour_picker
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT/&GT;    &LT;的TextView
        机器人:ID =@ + ID / textView3
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文字=HR
        机器人:textAppearance =机器人:ATTR / textAppearanceMedium/&GT;    &LT; NumberPicker
        机器人:ID =@ + ID / min_picker
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT/&GT;    &LT;的TextView
        机器人:ID =@ + ID / textView4
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文字=闽
        机器人:textAppearance =机器人:ATTR / textAppearanceMedium/&GT;
&LT; / LinearLayout中&GT;

TIMEPERIOD preference.java

 公共类TIMEPERIOD preference扩展对话框$ P $ {pference
    INT intervalLength = 0;    公共TIMEPERIOD preference(上下文的背景下,ATTRS的AttributeSet){
        超(背景下,ATTRS);
        setDialogLayoutResource(R.layout.time_ preference);
        setPositiveButtonText(android.R.string.ok);
        setNegativeButtonText(android.R.string.cancel);
        setDialogIcon(NULL);
        setPersistent(假);
    }    无效的setValue(INT intervalLength){
        NumberPicker hourPicker,minPicker;        hourPicker =(NumberPicker)getDialog()findViewById(R.id.hour_picker)。
        时间短=(短)(intervalLength / 60);
        hourPicker.setValue(小时);
        minPicker =(NumberPicker)getDialog()findViewById(R.id.min_picker)。
        短短几分钟=(短)(intervalLength 60%);
        minPicker.setValue(分钟);
    }    无效setDefaultValues​​(){
        NumberPicker hourPicker,minPicker;        hourPicker =(NumberPicker)getDialog()findViewById(R.id.hour_picker)。
        hourPicker.setMinValue(0);
        hourPicker.setMaxValue(23);
        hourPicker.setValue(0);
        minPicker =(NumberPicker)getDialog()findViewById(R.id.min_picker)。
        minPicker.setMinValue(0);
        minPicker.setMaxValue(59);
        minPicker.setValue(0);
    }    @覆盖
    保护无效onDialogClosed(布尔positiveResult){
        super.onDialogClosed(positiveResult);
        //当用户选择OK,持续的新值
        如果(positiveResult){
            NumberPicker hourPicker,minPicker;            hourPicker =(NumberPicker)getDialog()findViewById(R.id.hour_picker)。
            时间短=(短)((NumberPicker)hourPicker).getValue();
            minPicker =(NumberPicker)getDialog()findViewById(R.id.min_picker)。
            短短几分钟=(短)((NumberPicker)minPicker).getValue();
            intervalLength =小时* 60 +分钟;
        }
    }    @覆盖
    受保护的视图onCreateDialogView(){
        返回super.onCreateDialogView();
    }    @覆盖
    保护无效onSetInitialValue(布尔restorePersistedValue,对象设置defaultValue){
            setDefaultValues​​();
            intervalLength =(整数)设置defaultValue;
    }    / *(非Javadoc中)
     * @see机器人。preference.Dialog $ P $#pference onBindDialogView(android.view.View)
     * /
    @覆盖
    保护无效onBindDialogView(查看视图){
        super.onBindDialogView(视图);
    }
}

EditAlert preferencesActivity.java

公共类EditAlert preferencesActivity延伸活动{

 私有静态最后弦乐DISPLAY_MESSAGE =display_msg;
私有静态最后弦乐ALERT_TYPE =ALERT_TYPE;
私有静态最后弦乐时间间隔=间隔;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);    的setContentView(R.layout.user_ prefs_fragment);}//片段显示的MESG preference
公共静态类用户preferenceFragment扩展$ P $ {pferenceFragment    受保护的静态最后弦乐TAG =REGU;
    私人OnShared preferenceChangeListener mListener;
    私人preference showMsg preference;
    私人preference警告类型$ P ​​$ pference;
    私人preference区间preference;    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);        //从XML资源负载的preferences
        加preferencesFromResource(R.xml.user_ preFS);        //获取味精preference
        showMsg preference =(preference)获取preferenceManager()
                .find preference(DISPLAY_MESSAGE);
        警告类型$ P ​​$ pference =(preference)获取preferenceManager()
                .find preference(ALERT_TYPE);
        区间preference =(preference)获取preferenceManager()
                .find preference(间隔);
        //味精更改时附上一个监听器更新汇总
        mListener =新OnShared preferenceChangeListener(){
            @覆盖
            公共无效onShared preferenceChanged(
                    共享preferences共享preferences,串键){
                showMsg preference.setSummary(共享preferences.getString(
                        DISPLAY_MESSAGE,未设定));
                警告类型$ P ​​$ pference.setSummary(共享preferences.getString(
                        ALERT_TYPE,定期或一次));
                区间preference.setSummary(共享preferences.getString(
                        间隔,-1));
            }
        };        //获取共享preferences对象由preferenceManager的管理
        //这个片段
        共享preferences preFS = GET preferenceManager()
                .getShared preferences();        //注册共享preferences对象上的监听
        prefs.registerOnShared preferenceChangeListener(mListener);        //手动调用回调函数来显示味精
        mListener.onShared preferenceChanged(preFS,DISPLAY_MESSAGE);
        mListener.onShared preferenceChanged(preFS,ALERT_TYPE);
        mListener.onShared preferenceChanged(preFS,间隔);    }}

}

用户_ prefs_fragment.xml

 &LT;?XML版本=1.0编码=UTF-8&GT?;
&LT;片段的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    类=com.my preferences.EditAlert preferencesActivity $ USER preferenceFragment
    机器人:方向=垂直
    机器人:ID =@ + ID /用户preferenceFragment&GT;
&所述; /片断&gt;


解决方案

 当(在该方法),我应该访问人数采摘收获okay'ed值?

TIMEPERIOD preference 类需要实现 DialogInterface.OnClickListener 覆盖的onClick 方法是这样的。

 覆盖
公共无效的onClick(DialogInterface对话,诠释它){如果(这== DialogInterface.BUTTON_POSITIVE){
    //做你的东西来处理正面按钮 }否则如果(这== DialogInterface.BUTTON_NEGATIVE){
    //做你的东西来处理负面按钮
 }
}

然后你就可以访问确定按钮(BUTTON_POSITIVE)被点击数选择器。

编辑:

 为什么我的定制对话框preference数采摘缺少熟悉+  - 控制?

您需要一个最大和最小值设置为这样的选择器,显示增量和减量值。

  NumberPicker NP =(NumberPicker)findViewById(R.id.picker);
np.setMaxValue(100);
np.setMinValue(0);

您需要为 onCreateDialogView 选取器设置的默认值。只有在这里对话视图将被创建。

  @覆盖
受保护的视图onCreateDialogView(){
    查看dialogView = super.onCreateDialogView();
      //设置的默认值的视图
      NumberPicker hourPicker =(NumberPicker)dialogView.findViewById(R.id.hour_picker);
      hourPicker.setMinValue(0);
      hourPicker.setMaxValue(23);
      返回dialogView;
}

注:getDialog()只有当你显示对话框将有效

I am trying to use preferences in my UI to get values from the user and to fill into an object. Hence I do not wish to persist them. I created a custom TimePeriodPreference to get a time interval.

1) Why are the number pickers in my custom dialog preference missing the familiar +- controls? Furthermore, they do not allow input of text.

2) When (in which method) should I access the number pickers to harvest the values okay'ed? onDialogClosed() is too late. It gives me a null pointer error as the widgets are apparently lost by then.

    04-23 13:09:04.732: E/AndroidRuntime(9794): java.lang.NullPointerException
04-23 13:09:04.732: E/AndroidRuntime(9794):     at com.mypreferences.TimePeriodPreference.onDialogClosed(TimePeriodPreference.java:52)
04-23 13:09:04.732: E/AndroidRuntime(9794):     at android.preference.DialogPreference.onDismiss(DialogPreference.java:382)
04-23 13:09:04.732: E/AndroidRuntime(9794):     at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1235)

FYI, complete code is here https://www.dropbox.com/s/pul1eximvsfxsvz/DataManagementPreferenceActivity.zip

I followed the steps here: http://developer.android.com/guide/topics/ui/settings.html#Custom

and also here: Concise way of writing new DialogPreference classes?

Trying to move it here following the example here, also causes a null pointer

@Override
protected View onCreateDialogView() {
    hourPicker = (NumberPicker) getDialog().findViewById(R.id.hour_picker);
    minPicker = (NumberPicker) getDialog().findViewById(R.id.min_picker);

    return super.onCreateDialogView();
}

Note the missing +- controls

time_preference.xml

<TextView
    android:id="@+id/textView5"
    android:layout_width="wrap_content"
    android:layout_height="38dp"
    android:gravity="bottom"
    android:text="remind every"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <NumberPicker
        android:id="@+id/hour_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hr"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <NumberPicker
        android:id="@+id/min_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Min"
        android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>

TimePeriodPreference.java

public class TimePeriodPreference extends DialogPreference {
    int intervalLength = 0;

    public TimePeriodPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setDialogLayoutResource(R.layout.time_preference);
        setPositiveButtonText(android.R.string.ok);
        setNegativeButtonText(android.R.string.cancel);
        setDialogIcon(null);
        setPersistent(false);
    }

    void setValue(int intervalLength) {
        NumberPicker hourPicker, minPicker;

        hourPicker = (NumberPicker) getDialog().findViewById(R.id.hour_picker);
        short hours = (short) (intervalLength / 60);
        hourPicker.setValue(hours);
        minPicker = (NumberPicker) getDialog().findViewById(R.id.min_picker);
        short minutes = (short) (intervalLength % 60);
        minPicker.setValue(minutes);
    }

    void setDefaultValues() {
        NumberPicker hourPicker, minPicker;

        hourPicker = (NumberPicker) getDialog().findViewById(R.id.hour_picker);
        hourPicker.setMinValue(0);
        hourPicker.setMaxValue(23);
        hourPicker.setValue(0);
        minPicker = (NumberPicker) getDialog().findViewById(R.id.min_picker);
        minPicker.setMinValue(0);
        minPicker.setMaxValue(59);
        minPicker.setValue(0);
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
        // When the user selects "OK", persist the new value
        if (positiveResult) {
            NumberPicker hourPicker, minPicker;

            hourPicker = (NumberPicker) getDialog().findViewById(R.id.hour_picker);
            short hours = (short) ((NumberPicker) hourPicker).getValue();
            minPicker = (NumberPicker) getDialog().findViewById(R.id.min_picker);
            short minutes = (short) ((NumberPicker) minPicker).getValue();
            intervalLength = hours * 60 + minutes;
        }
    }

    @Override
    protected View onCreateDialogView() {
        return super.onCreateDialogView();
    }

    @Override
    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
            setDefaultValues();
            intervalLength = (Integer) defaultValue;
    }

    /* (non-Javadoc)
     * @see android.preference.DialogPreference#onBindDialogView(android.view.View)
     */
    @Override
    protected void onBindDialogView(View view) {
        super.onBindDialogView(view);
    }
}

EditAlertPreferencesActivity.java

public class EditAlertPreferencesActivity extends Activity {

private static final String DISPLAY_MESSAGE = "display_msg";
private static final String ALERT_TYPE = "alert_type";
private static final String INTERVAL = "interval";

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

    setContentView(R.layout.user_prefs_fragment);

}

// Fragment that displays the mesg preference
public static class UserPreferenceFragment extends PreferenceFragment {

    protected static final String TAG = "REGU";
    private OnSharedPreferenceChangeListener mListener;
    private Preference showMsgPreference;
    private Preference alertTypePreference;
    private Preference intervalPreference;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.user_prefs);

        // Get the msg Preference
        showMsgPreference = (Preference) getPreferenceManager()
                .findPreference(DISPLAY_MESSAGE);
        alertTypePreference = (Preference) getPreferenceManager()
                .findPreference(ALERT_TYPE);
        intervalPreference = (Preference) getPreferenceManager()
                .findPreference(INTERVAL);          
        // Attach a listener to update summary when msg changes
        mListener = new OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(
                    SharedPreferences sharedPreferences, String key) {
                showMsgPreference.setSummary(sharedPreferences.getString(
                        DISPLAY_MESSAGE, "None Set"));
                alertTypePreference.setSummary(sharedPreferences.getString(
                        ALERT_TYPE, "regular intervals or one time"));          
                intervalPreference.setSummary(sharedPreferences.getString(
                        INTERVAL, "-1"));   
            }
        };

        // Get SharedPreferences object managed by the PreferenceManager for
        // this Fragment
        SharedPreferences prefs = getPreferenceManager()
                .getSharedPreferences();

        // Register a listener on the SharedPreferences object
        prefs.registerOnSharedPreferenceChangeListener(mListener);

        // Invoke callback manually to display the msg
        mListener.onSharedPreferenceChanged(prefs, DISPLAY_MESSAGE);
        mListener.onSharedPreferenceChanged(prefs, ALERT_TYPE);
        mListener.onSharedPreferenceChanged(prefs, INTERVAL);

    }

}

}

user_prefs_fragment.xml

    <?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.mypreferences.EditAlertPreferencesActivity$UserPreferenceFragment"
    android:orientation="vertical" 
    android:id="@+id/userPreferenceFragment">    
</fragment>

解决方案

When (in which method) should I access the number pickers to harvest the values okay'ed? 

Your TimePeriodPreference class need to implements the DialogInterface.OnClickListener and Override the onClick method like this.

Override
public void onClick(DialogInterface dialog, int which){

if(which == DialogInterface.BUTTON_POSITIVE) {
    // do your stuff to handle positive button

 }else if(which == DialogInterface.BUTTON_NEGATIVE){
    // do your stuff to handle negative button
 }
}

And then you can access the number picker when the Ok button (BUTTON_POSITIVE) is clicked.

EDIT:

Why are the number pickers in my custom dialog preference missing the familiar +- controls? 

You need to set a Max and Minimum value to the picker like this, to display the increment and decrement values.

NumberPicker np = (NumberPicker)findViewById(R.id.picker);
np.setMaxValue(100);
np.setMinValue(0);

You need to set the default values for the picker in onCreateDialogView. Only here the dialog view will be created.

    @Override
protected View onCreateDialogView() {
    View dialogView =  super.onCreateDialogView();
      // set the default values to the view
      NumberPicker hourPicker = (NumberPicker) dialogView.findViewById(R.id.hour_picker);
      hourPicker.setMinValue(0);
      hourPicker.setMaxValue(23);
      return dialogView;
}

Note: getDialog() will be valid only when you show the dialog.

这篇关于问题试图创建一个自定义对话框preference,获取一个时间段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆