我刚刚使用AndroidStudio向导创建了一个PreferenceActivity,运行它时抛出了一个奇怪的异常:
java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid!
Run Code Online (Sandbox Code Playgroud)
我在这里看到了建议的解决方案,但我想知道为什么我必须检查我的片段类是否有效,因为我甚至不完全理解"有效"的定义,所以我决定问社区:
一个PreferenceActivity有isValidFragment(String fragmentName)一些方法,由于某种原因必须覆盖,为什么?片段类怎么可能无效?这样的覆盖会出现什么问题:
@Override
protected boolean isValidFragment(String fragmentName)
{
return true;
}
Run Code Online (Sandbox Code Playgroud) 对于我工作的某些应用程序,对于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.
Run Code Online (Sandbox Code Playgroud)
然后,我发现对于那些应用程序,android框架protected 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;
} …Run Code Online (Sandbox Code Playgroud) 我正在编写我的第一个针对ICS的应用程序(4.0.3 - 15级).我得到了动作棒,我认为它们很棒.但是我第一次尝试片段,我仍然不确定我是否喜欢它们.我正在处理的应用程序不需要片段,因为它在屏幕上的要求非常不动.标准活动工作正常.但是,我必须将PreferenceActivity与PreferencFragment和Headers一起使用.直接到首选项定义xml文件的旧形式的活动已被折旧.因此,我学会了使用偏好片段来强制显示首选项.(顺便说一下,有没有人想出如何跳过显示标题.我用了两个来学习经验.一个指向单个片段类就足够了.但是只用一个标题进行双重选择看起来很糟糕. .)
我一直在使用模拟器的东西,直到大约3天前,一切正常.当我将测试移到设备上时,我可以获得显示标题的首选项屏幕(PreferenceActivity类).但是,当我选择一个标题(调用PreferencesFragment类)时,我收到了"抱歉你的应用已停止"的消息.回到模拟器上,一切正常.当我生成我的APK时,我终于明白我正在使用Proguard由于所有视图都是由标准活动驱动的,除了我的设置活动以外,大部分工作都有效.当我关闭Proguard时,一切正常,包括设置.在我的Crittercism崩溃报告中,Proguard打开时产生的错误是找不到类.找不到内联的PreferenceFragment类.
例如,使用标题
android:fragment="com.mycompany.projectname.FragmentPreferences$SettingsFragment"
Run Code Online (Sandbox Code Playgroud)
设备上运行的Android操作系统找不到内联类SettingsFragment.
关闭Proguard并重新安装APK,上面的标题工作正常.无论有没有Proguard,总会找到PreferenceActivity类FragmentPreferences并显示标题.选择显示的标题时失败(调用SettingsFragment)...
我试过-dontoptimize和-dontshrink,但我的应用仍然无法与Proguard合作.我的Proguard设置是标准的; 即,当我使用Eclipse向导(ADT R20 - 最新和最好)创建一个新应用程序时生成.以下是我正在尝试运行的设置:
在项目属性中:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
target=Google Inc.:Google APIs:15
In proguard-project:
-keepattributes SourceFile, LineNumberTable
-dontshrink
-dontoptimize
Run Code Online (Sandbox Code Playgroud)
所有标准活动(无片段)都可以在基本设置下正常工作.添加-dont是为了限制Proguard进行混淆.调用内联片段类时,设置仍然会爆炸.
目前我正在关闭Proguard生成APK.当我准备好投入生产时,我想把它重新打开.
(顺便说一句,我将PreferenceFragment类移动到外部类,并且在调用Proguard时它们仍然不起作用.)
我在这里输入了足够多的东西,仍然没有问我的问题.好的,我会用问题关闭它:
有人知道使共享首选项片段类可见所需的正确Proguard设置吗?如果这个问题扩展到常规片段使用,那些设置是什么?