当来自PreferenceActivity的android的isValidFragment()被调用时?

对于我工作的某些应用程序,对于API级别为19的设备,我会遇到异常
Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com... has not checked if fragment com...$. is valid.

然后,我发现对于那些应用程序android框架受保护的boolean isValidFragment(String fragmentName)被调用,它有代码

if (getApplicationInfo().targetSdkVersion  >= android.os.Build.VERSION_CODES.KITKAT) {
        throw new RuntimeException(
                "Subclasses of PreferenceActivity must override isValidFragment(String)"
                + " to verify that the Fragment class is valid! " + this.getClass().getName()
                + " has not checked if fragment " + fragmentName + " is valid.");
    } else {
        return true;
}

然后我试图复制错误

我从Preferences Activity Example获取了示例应用程序的代码
添加了行< uses-sdk android:targetSdkVersion =“19”/>在清单中.

但奇怪的是,我没有得到错误(在这种情况下isValidFragment()没有被调用).

所以请告诉我如何在我的示例应用程序中复制该错误.

解决方法

似乎是一个bug或4.4安全限制. Workaraound将使用仍然与PreferenceActivity兼容的低于19的任何东西,并咬住用于与旧目标进行编译的子弹.

我正在使用标题“pattern”作为PreferenceActivity(覆盖public void onBuildHeaders(List< Header> target)),我认为OP也是,很可能是事情发生和崩溃的地方.

在我的情况下,我已将此异常缩小为< uses-sdk android:targetSdkVersion =“19”/>,[14-18]构建目标中的任何内容都将编译并运行而不会出现问题.

建议(对于Eclipse):我从来没有直接搞砸了这些东西,但我假设你在一个不同的项目上编译你的PreferenceActivity(和可能是片段),目标是18或以下(不是意图:O),然后使用该项目作为针对KitKat(19)的主项目的库,也许您可​​以在运行时避免崩溃场​​景,同时仍然使用最新版本所需的功能(只要这些功能不在构建中 – 18-bound PreferenceActivity).如果这不成功,请尝试以jar形式(预编译)的项目,而不是使用项目作为库.

更新:还要注意CamilleSévigny的回答.如果问题与其他问题有关(恕我直言的可能性为50%),那么针对API 18的所有应用都容易受到片段注入攻击(请参阅他的链接问题).

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...