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