在早于Lollipop的Android版本中,我在尝试实例化片段时不断收到VerifyError,导致应用程序崩溃。有人可以向我解释这个错误的原因吗?
12-19 17:46:52.510 28238-28238/com.greeblu.tootl2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.greeblu.tootl2, PID: 28238
java.lang.VerifyError: com/greeblu/tootl2/fragment/ProfileGridFragment
at com.greeblu.tootl2.activity.ProfileActivity.launchGridFragment(ProfileActivity.java:289)
at com.greeblu.tootl2.fragment.ProfileOverlayFragment$3.onClick(ProfileOverlayFragment.java:123)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18439)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5034)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(Native Method)
这就是我为较旧的Android版本调用片段的方式:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.profileContainer, new ProfileGridFragment(),fragmentTag); //Replaces the Fragment C previously in the right_container with a new Fragment B
ft.commit();
修改 onClick调用的代码如下。它是从同一活动中的另一个片段调用的
picContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((ProfileActivity) getActivity()).launchGridFragment(overlayDp, "all");
}
});
答案 0 :(得分:0)
我遇到了这个确切的错误,因为我有一个try-catch块,其异常类在旧的android版本上不可用。该块甚至不在构造函数中,而是在onClick方法之一中,因此甚至没有执行该代码,但是,当我尝试创建该片段时,应用程序始终会由于VerifyError崩溃。
通过使用instanceof check更改子句块来解决:
崩溃:
try {
...
} catch (FileUriExposedException e) {
...
}
工作正常:
try {
...
} catch (Exception e) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && e instanceof FileUriExposedException) {
...
}
}
答案 1 :(得分:0)
您是否正在使用android.support.v4.app.Fragment中的support Fragment类?如果是这样,您需要致电
getSupportFragmentManager()
代替
getFragmentManager()
请注意,现已弃用android.app.Fragment中的Fragment类。