Android 单击侦听器设备

Android 单击侦听器设备,android,sharedpreferences,clicklistener,Android,Sharedpreferences,Clicklistener,你能告诉我为什么当用户进入设置屏幕时,这个点击监听器会使Android设备崩溃吗 /* * Create the preference from the xml file. This will be used in a click * listener. */ Preference settingWallpaperChangingIsActivated = (Preference) findPreference("checkbox_change_w

你能告诉我为什么当用户进入设置屏幕时,这个点击监听器会使Android设备崩溃吗

    /*
     * Create the preference from the xml file. This will be used in a click
     * listener.
     */
    Preference settingWallpaperChangingIsActivated = (Preference)  findPreference("checkbox_change_wallpaper_is_activated");

    settingWallpaperChangingIsActivated
            .setOnPreferenceClickListener(new OnPreferenceClickListener() {
                public boolean onPreferenceClick(Preference  preference) {
                    return true;
                }
            });
以下是与此单击侦听器相关的settings.xml文件

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory android:title="@string/category_title_wallpaper">
    <CheckBoxPreference android:key="checkbox_change_wallpaper_is_activated"
        android:title="@string/item_title_change_wallpaper"   android:summary="@string/item_summary_change_wallpaper"
        android:defaultValue="false" />

    <ListPreference android:title="@string/list_title_time_before_changing_wallpaper"
        android:key="list_time_before_changing_wallpaper" android:summary="@string/list_summary_time_before_changing_wallpaper"
        android:entries="@array/label_time_before_changing_wallpaper"
        android:entryValues="@array/value_time_before_changing_wallpaper"
        android:defaultValue="Default" />

    <!-- -->
</PreferenceCategory>

</PreferenceScreen>

在代码中,您使用的是
首选项
对象,而在XML中使用的是
复选框首选项
。这是两件不同的事情,如果我没记错的话,你不能把一件抛给另一件

另外,我认为你想要的合适的倾听者是

CheckBoxPreference.OnPreferenceChangeListener() {
        public boolean onPreferenceChange(final Preference preference, final Object newValue) {
            // Your code here. Make good use of preference and newValue.
            // You can cast newValue to boolean, for example.
        }
}
完整工作样本:

Preference settingWallpaperChangingIsActivated = (CheckBoxPreference) findPreference("checkbox_change_wallpaper_is_activated");

settingWallpaperChangingIsActivated.setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
    public boolean onPreferenceChange(final Preference preference, final Object newValue) {


        boolean activated = (Boolean) newValue;
        updateStuff(activated);
        return true;


    }
});

在代码中,您使用的是
首选项
对象,而在XML中使用的是
复选框首选项
。这是两件不同的事情,如果我没记错的话,你不能把一件抛给另一件

另外,我认为你想要的合适的倾听者是

CheckBoxPreference.OnPreferenceChangeListener() {
        public boolean onPreferenceChange(final Preference preference, final Object newValue) {
            // Your code here. Make good use of preference and newValue.
            // You can cast newValue to boolean, for example.
        }
}
完整工作样本:

Preference settingWallpaperChangingIsActivated = (CheckBoxPreference) findPreference("checkbox_change_wallpaper_is_activated");

settingWallpaperChangingIsActivated.setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
    public boolean onPreferenceChange(final Preference preference, final Object newValue) {


        boolean activated = (Boolean) newValue;
        updateStuff(activated);
        return true;


    }
});


错误出现在
onCreate()
方法中hajj.auto.wallpaper.free.SettingsActivity的第51行。如果没有看到代码,我不能告诉你更多。虽然我猜这可能是因为您试图将侦听器添加到尚未初始化的对象(可能仍然是
null
)。

错误位于
onCreate()
方法中的
hajj.auto.wallper.free.SettingsActivity
的第51行。如果没有看到代码,我不能告诉你更多。虽然我猜这可能是因为您试图将侦听器添加到尚未初始化的对象(可能仍然是
null
)。

您可以发布应用程序崩溃时生成的stacktrace吗?嗨,slayton,如果这就是您所说的stracktrace,我添加了LogCat。谢谢。CheckBoxPreference设置壁纸更改激活=(CheckBoxPreference)查找参考(“复选框更改壁纸激活”);试试这个。大家好,我在你们的帮助下成功了。我在上面的评论中第一次尝试了代码,但它仍然崩溃了。接下来,我尝试将首选项名称从“checkbox\u change\u wallpaper\u is\u activated”缩短为“checkbox\u changing\u is\u activated”,但没有崩溃。看起来至少在我的电脑上,这些名字的长度有某种限制。再次感谢大家的帮助。你能发布应用程序崩溃时生成的stacktrace吗?嗨,slayton,我添加了LogCat,如果这就是你所说的stracktrace。谢谢。CheckBoxPreference设置壁纸更改激活=(CheckBoxPreference)查找参考(“复选框更改壁纸激活”);试试这个。大家好,我在你们的帮助下成功了。我在上面的评论中第一次尝试了代码,但它仍然崩溃了。接下来,我尝试将首选项名称从“checkbox\u change\u wallpaper\u is\u activated”缩短为“checkbox\u changing\u is\u activated”,但没有崩溃。看起来至少在我的电脑上,这些名字的长度有某种限制。再次感谢大家的帮助。哦,我的答案有一个小问题。初始化时在两侧使用CheckBoxPreference。我复制粘贴了你的样本,但忘了更改。嗨,大卫,我收到一个错误,上面写着“CheckBoxPreference无法解析为类型”。我错过什么了吗?你需要导入它。如果您使用Eclipse进行开发,应该有一个使用它的提示。否则,在导入列表中放置(无引号):“导入android.preference.CheckBoxPreference;”嗨,大卫,是的,我正在使用Eclipse。导入崩溃时也在那里。嗨,大卫,你认为我的首选项名称“复选框\更改\壁纸\激活”太长吗?可能有一些时间限制。哎呀,我的答案有一个小问题。初始化时在两侧使用CheckBoxPreference。我复制粘贴了你的样本,但忘了更改。嗨,大卫,我收到一个错误,上面写着“CheckBoxPreference无法解析为类型”。我错过什么了吗?你需要导入它。如果您使用Eclipse进行开发,应该有一个使用它的提示。否则,在导入列表中放置(无引号):“导入android.preference.CheckBoxPreference;”嗨,大卫,是的,我正在使用Eclipse。导入崩溃时也在那里。嗨,大卫,你认为我的首选项名称“复选框\更改\壁纸\激活”太长吗?可能对它的长度有一些限制。嗨,David,我删除了措辞,让intellisense填充它,它编译正常,但仍然崩溃。嗨,Slayton,我应该在调用设置屏幕之前使用pref编辑器并将其设置为false,因为我希望xml文件中的默认值语句会给它一个值?谢谢。嗨,Slayton,onCreate()方法的第51行是click listener编码。Opps,我的意思是更改listener。您不需要使用文本编辑器,甚至不需要在首选项XML文件中添加“android:defaultValue”。对于每个首选项,Android都会自动提供默认值(对于复选框,我认为它是错误的,但现在不记得了)。当然,在用户实际与小部件交互之前,不会更改内部首选项文件。而且,因为你不需要,并不意味着你不应该。通常,人们创建一个默认生成器,并在用户首次运行应用程序时检查它。这是一种常见的模式。嗨,David,我删除了措辞,让intellisense填充它,它编译正常,但仍然崩溃。嗨,Slayton,我应该在调用设置屏幕之前使用pref编辑器并将其设置为false,因为我希望xml文件中的默认值语句会给它一个值吗?谢谢。嗨,Slayton,onCreate()方法的第51行是click listener编码。Opps,我的意思是更改listener。您不需要使用文本编辑器,甚至不需要在首选项XML文件中添加“android:defaultValue”。对于每个首选项,Android都会自动提供默认值(对于复选框,我认为它是错误的,但现在不记得了)。当然,在用户实际与小部件交互之前,不会更改内部首选项文件。还有,因为