【问题标题】:Handling OnPreferenceChangeListener in API11在 API 11 中处理 OnPreferenceChange 监听器
【发布时间】:2014-05-30 16:07:43
【问题描述】:

有没有办法在 API11 中处理 OnPreferenceChangeListener。简单地调用 Preference.setOnPreferenceChangeListener 会引发一个 lint 错误,说明它需要 API14+,但是我的应用是为 API11+ 设计的,我不想进一步限制它可以运行的设备数量。

更新:我已经检查了开发文档,这应该可以从 API1 获得

编辑:代码

import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;
import android.preference.SwitchPreference;

@SuppressWarnings("deprecation")
public class SettingsActivity extends PreferenceActivity {
private static final String tag = "PREFERENCES";
SwitchPreference appPower;

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

    addPreferencesFromResource(R.xml.preferences_layout);

    setupPreferenceElements();

    LogHelper.i(tag, "Preferences Activity Started");
}

private void setupPreferenceElements() {
    appPower = (SwitchPreference) getPreferenceManager().findPreference(
            "power");
    appPower.setChecked(SettingsManager.getPower());
    appPower.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference,
                Object newValue) {
            LogHelper.i(tag, "App Power Changed to " + newValue.toString());
            SettingsManager.setPower(Boolean.parseBoolean(newValue
                    .toString()));
            return true;
            }
        });
    }
}

【问题讨论】:

  • 我刚刚制作了一个测试应用程序(最小 API:8,目标:10,然后最小:13,目标:14)并且在任何一种情况下都没有问题。我们需要查看一些代码来进一步排除故障。
  • 我可以给出导致问题的实际行。你还需要什么?
  • Em... 您的导入可能并且显然任何其他行在逻辑上与给出错误的行一起使用。但在我们走得太远之前,您使用的是什么 IDE?您是否尝试过“刷新”项目、“清理”代码并重新启动 IDE?有时将其关闭然后再次打开是解决方案。 =0p
  • 我已经添加了我的代码。我正在使用 Eclipse。是的,尝试过干净,但没有用
  • 认为我找到了问题,提交答案。

标签: android android-preferences android-settings


【解决方案1】:

android.preference.SwitchPreference 仅在 API v14 中添加(与TwoStatePreference 一起添加,以防您首先使用它)

如果您想继续使用 SwitchPreference for 14+ 并支持 13- 您将需要:

  • 创建一个文件夹res/xml-v14/
  • 将您当前的preferences.xml 与您的 SwitchPreference 一起使用
  • 创建另一个文件夹(如果需要)res/xml/ 和另一个 preferences.xml,并将您的 SwitchPreference 更改为 CheckBoxPreference。

这将根据所使用的 API 版本加载正确的版本。您还需要检查 Java 代码中的 API 版本。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
    appPower = new SwitchPreference(this);
} else {
    appPower = new CheckBoxPreference(this);
}

如果您不喜欢 CheckboxPreference,您可以随时 extend Preferenceextend CheckboxPreference 推出您自己的解决方案。这实际上可能是最好的解决方案,因为它的优点是能够将两个版本包装在一个类中,然后您可以支持您的首选实现,确保您想要使用的方法被公开并且不会失败,而无需手动版本检查在您使用 Preference 的任何地方键入强制转换。

在进行一些搜索时,我偶然发现了您可能会使用的this library。它旨在支持 SwitchPreference。我不能说它的效果如何,或者你是否应该使用它,但我从未尝试过。

【讨论】:

  • 谢谢。我会试一试并回复。
  • @RobertEves92,更新,我已经添加了一个关于如何处理代码中不同版本的部分。
  • 有什么方法可以在 API14+ 设备上测试 API13- 的代码吗?
  • 没有。您应该使用模拟器进行此类测试。我建议使用 Genymotion 和 VirtualBox,而不是默认模拟器。如果您想从 Eclipse 中启动模拟器,那么设置起来也很容易,只要确保您也获取了 Eclipse 插件。 Genymotion site 上的所有说明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多