解决PreferenceFragment和v4.Fragment不兼容问题与java.lang.VerifyError

一般项目上做一个viewpage和fragment的滑动效果时,会使用v4的fragment和FragmentPagerAdapter.

但是在做设置界面的时候又会用到PreferenceFragment,这就有个矛盾了:

PreferenceFragment和v4.Fragment不兼容问题

FragmentPagerAdapter用的是v4的fragment和继承子app.Fragment的PreferenceFragment不兼容.
如何兼容一下呢?

在网上找到了一种解决方案,来自stackoverflow,
Adding PreferenceFragment to FragmentPagerAdapter

here are the modifications you need to make to upgrade to v13:

  • Delete "android-support-v4.jar" file from your libs folder
  • Copy "android-support-v13.jar" from SDK_PATH\extras\android\support\v13; if it's not there, use the SDK manager to install or update "Extras/Android Support Library"

Then, in the Java file:

  • Change FragmentPagerAdapter import from v4 to v13
  • Change FragmentActivity to a plain Activity
  • Change calls to getSupportFragmentManager to getFragmentManager
  • Import all necessary classes from android.app instead of android.support.v4
  • (Except: you still need to use the v4 ViewPager, but it's compatible)

I've copied the modified source below, verified on latest Jellybean.

简单说就是v13的FragmentPagerAdapter是支持app.Fragment的, 何不使用v13的替换v4的呢.

参照所说步骤,确实可行.把相关的v4.Fragment全替换为了app.Fragment.

但是成功编译apk,安装到手机的时候,报了一个新的错误VerifyError.很面生
从log提示看java类0行就报错了,问题不简单 : ) 正好调查下看看

java.lang.VerifyError

从网上找到引起该问题的原因:

一般地,java.lang.VerifyError 是说
JVM 在加载一个类时,会去校验类的正确性,只有类文件不合法才会报这个Error。

然而其中有个解决方法有些奇怪:

To do so:

1. go to "File" > "Settings" > "Build, Execution, Deployment" > "Instant Run"
2. uncheck the box "Enable Instant Run..." and click "OK" button

然后试了下重新运行,竟然真的就没有这个问题了.

不过这种随意修改studio默认配置的解决方案不是我想要的,需要找出真正的原因.

也有的说是高级的jar包会和低级的jar产生冲突.
项目中有v7包v4包,有的说v7包含v4,那把v4删除看看呢?
试了下,结果不行.看来问题不再包上.

类一开始就报错,还有什么原因呢?

之后翻到了另一个该错误的解释:

出现这个错误是因为改变了原有类继承的父类。导致Instant Run 增量编译时分包出错,验证继承关系时造成了混乱。
可以clean工程后,重新编译即可。

对了,如果删v4只是猜测的话, 不对很正常.

那从这个描述看,我确实有修改的:
我将该类的父类的v4.fragment该为原来app.fragment了.跟该问题描述很像.

然后clean了工程,并将手机上的app删除并重装.

问题解决~

看似很简单的小问题,却要在网上找半天,花费了很多时间.
别人的回答很精彩,思考问题的角度深度都挺强的.然而老是参考别人的方法,没有自己的思考模式可不好.

多多积累经验,希望以后可以越来越少的直接从网上搜答案,更多的自己去思考问题,挖掘问题原因.
深层次接触了解源码实现,慢慢达到厚积而薄发.

你可能感兴趣的:(解决PreferenceFragment和v4.Fragment不兼容问题与java.lang.VerifyError)