Android 尝试创建获取时间段的自定义对话框首选项时出现问题

Android 尝试创建获取时间段的自定义对话框首选项时出现问题,android,android-fragments,Android,Android Fragments,我试图在我的UI中使用首选项从用户那里获取值并填充到对象中。因此,我不想坚持。我创建了一个自定义的TimePeriodPreference来获取时间间隔 1) 为什么自定义对话框首选项中的数字选择器缺少熟悉的+-控件?此外,它们不允许输入文本 2) 我应该在什么时候(用哪种方法)访问数字选择器以获取正确的值?onDialogClosed()太晚了。它给了我一个空指针错误,因为小部件显然已经丢失了 04-23 13:09:04.732: E/AndroidRuntime(9794): ja

我试图在我的UI中使用首选项从用户那里获取值并填充到对象中。因此,我不想坚持。我创建了一个自定义的TimePeriodPreference来获取时间间隔

1) 为什么自定义对话框首选项中的数字选择器缺少熟悉的+-控件?此外,它们不允许输入文本

2) 我应该在什么时候(用哪种方法)访问数字选择器以获取正确的值?onDialogClosed()太晚了。它给了我一个空指针错误,因为小部件显然已经丢失了

    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)
仅供参考,完整的代码在这里

我遵循以下步骤:

还有这里:

尝试按照示例将其移动到此处也会导致空指针

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

    return super.onCreateDialogView();
}
请注意缺少的+-控件

time_preference.xml

EditAlertPreferencesActivity.java

公共类EditAlertPreferencesActivity扩展活动{

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>

您的
TimePeriodPreference
类需要实现
DialogInterface.OnClickListener
Override
这样的
onClick
方法

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
 }
}
然后,当单击
Ok
按钮
(按钮为正)
时,您可以访问号码选择器

编辑:

您需要像这样设置选择器的最大值和最小值,以显示增量和减量值

NumberPicker np = (NumberPicker)findViewById(R.id.picker);
np.setMaxValue(100);
np.setMinValue(0);
您需要在
onCreateDialogView
中设置选择器的默认值。仅在此处创建对话框视图

    @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;
}

注意:getDialog()仅在显示对话框时有效。

我尝试过,但实际上,数字选择器不起作用-无法在整个布局中输入任何文本?清单中的应用程序主题是什么?请尝试删除TextView并仅使用pickerremoved查看所有TextView,与chat中提到的相同,我无法访问构造函数中setDialogLayoutResource()所在的numberpicker。
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
 }
}
Why are the number pickers in my custom dialog preference missing the familiar +- controls? 
NumberPicker np = (NumberPicker)findViewById(R.id.picker);
np.setMaxValue(100);
np.setMinValue(0);
    @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;
}