Я пытаюсь передать ViewPage в Fragement в моем приложении. Но приложение вылетает при открытии приложения после того, как оно было убито ОС, или при повторном открытии приложения из фона, когда в настройках разработчика включено «Не сохранять действия».
Вот сводка сообщения об ошибке от Logcat:
(1) java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.test3 / com.test.MainActivity}: java.lang.RuntimeException: Parcelable обнаружил IOException, считывающий объект Serializable (name = com.test.VerticalViewPager)
(2) Причина: java.lang.RuntimeException: Parcelable обнаружил IOException, читающее Serializable объект (name = com.test.VerticalViewPager)
(3) вызвано: java.io.InvalidClassException: com.test.VerticalViewPager; нет действительного конструктора
После некоторого повторного поиска я обнаружил, что класс Java, в котором реализован Serializable, ДОЛЖЕН иметь конструктор без аргументов (ссылка: http://burnignorance.com/java-web-development-tips/java-serialization-and-need-for-a-no-arg-constructor/).
Android Studio постоянно предупреждает меня о том, что «в конструкторе android.support.v4.view.ViewPager» нет конструктора по умолчанию », когда я пытаюсь добавить конструктор без аргументов в мой класс ViewPager.
Я провел целый день исследований и до сих пор не знаю, как его решить. Пожалуйста, дайте мне знать, если у вас есть идеи, спасибо
Вот класс Fragment:
public final class FragmentTest extends Fragment {
private static final String VERTICALVIEWPAGER = "VERTICALVIEWPAGER";
public static FragmentTest newInstance(VerticalViewPager myVerticalViewPager) {
FragmentTest f = new FragmentTest();
Bundle args = new Bundle();
args.putSerializable(VERTICALVIEWPAGER, myVerticalViewPager);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = (MainActivity) getActivity();
// Error at this line when open the App after it was killed by OS (Or reopen the App from background while "Don't keep activities" is enabled )
myVerticalViewPager = getArguments() != null ? (VerticalViewPager) (getArguments().getSerializable(VERTICALVIEWPAGER)) : null;
}
}
Вот класс ViewPager:
public final class VerticalViewPager extends ViewPager implements Serializable{
public VerticalViewPager(Context context) {
super(context);
init();
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
// The majority of the magic happens here
setPageTransformer(true, new VerticalPageTransformer());
// The easiest way to get rid of the overscroll drawing that happens on the left and right
setOverScrollMode(OVER_SCROLL_NEVER);
}
.
.
.
}
Вот полное сообщение Logcat:
2019-04-16 11: 40: 27.676 5369-5369 / com.test3 E / AndroidRuntime: FATAL
ИСКЛЮЧЕНИЕ: основной процесс: com.test3, PID: 5369
java.lang.RuntimeException: Невозможно начать деятельность
ComponentInfo {com.test3 / com.test.MainActivity}:
java.lang.RuntimeException: Parcelable встретил чтение IOException
Сериализуемый объект (name = com.test.VerticalViewPager) в
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2812)
в
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2890)
на android.app.ActivityThread.-wrap11 (неизвестный источник: 0) на
android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1611)
на android.os.Handler.dispatchMessage (Handler.java:106) на
android.os.Looper.loop (Looper.java:171) в
android.app.ActivityThread.main (ActivityThread.java:6633) в
java.lang.reflect.Method.invoke (родной метод) в
com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:547)
на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823)
Вызвано: java.lang.RuntimeException: Parcelable обнаружен
IOException, читающая Сериализуемый объект (name =
com.test.VerticalViewPager) в
android.os.Parcel.readSerializable (Parcel.java:3007) в
android.os.Parcel.readValue (Parcel.java:2797) в
android.os.Parcel.readArrayMapInternal (Parcel.java:3115) в
android.os.BaseBundle.initializeFromParcelLocked (BaseBundle.java:273)
на android.os.BaseBundle.unparcel (BaseBundle.java:226) на
android.os.BaseBundle.getSerializable (BaseBundle.java:1199) в
android.os.Bundle.getSerializable (Bundle.java:1033) в
com.test.view.FragmentTest.onCreate (FragmentTest.java:79) в
android.support.v4.app.Fragment.performCreate (Fragment.java:2339) в
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1377)
в
android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1740)
в
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1809)
в
android.support.v4.app.FragmentManagerImpl.dispatchStateChange (FragmentManager.java:3217)
в
android.support.v4.app.FragmentManagerImpl.dispatchCreate (FragmentManager.java:3166)
в
android.support.v4.app.FragmentController.dispatchCreate (FragmentController.java:181)
в
android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:319)
вandroid.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:84)
на com.test.MainActivity.onCreate (MainActivity.java:364) на
android.app.Activity.performCreate (Activity.java:7084) в
android.app.Activity.performCreate (Activity.java:7075) в
android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1215)
в
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2765)
в
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2890)
на android.app.ActivityThread.-wrap11 (неизвестный источник: 0) на
android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1611)
на android.os.Handler.dispatchMessage (Handler.java:106) на
android.os.Looper.loop (Looper.java:171) в
android.app.ActivityThread.main (ActivityThread.java:6633) в
java.lang.reflect.Method.invoke (родной метод) в
com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:547)
на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823)
Вызывается: java.io.InvalidClassException: com.test.VerticalViewPager;
нет действительного конструктора в
java.io.ObjectStreamClass $ ExceptionInfo.newInvalidClassException (ObjectStreamClass.java:147)
в
java.io.ObjectStreamClass.checkDeserialize (ObjectStreamClass.java:757)
в
java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1778)
в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1354)
в java.io.ObjectInputStream.readObject (ObjectInputStream.java:374)
на android.os.Parcel.readSerializable (Parcel.java:3005) на
android.os.Parcel.readValue (Parcel.java:2797) в
android.os.Parcel.readArrayMapInternal (Parcel.java:3115) в
android.os.BaseBundle.initializeFromParcelLocked (BaseBundle.java:273)
на android.os.BaseBundle.unparcel (BaseBundle.java:226) на
android.os.BaseBundle.getSerializable (BaseBundle.java:1199) в
android.os.Bundle.getSerializable (Bundle.java:1033) в
com.test.view.FragmentTest.onCreate (FragmentTest.java:79) в
android.support.v4.app.Fragment.performCreate (Fragment.java:2339) в
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1377)
в
android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1740)
в
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1809)
в
android.support.v4.app.FragmentManagerImpl.dispatchStateChange (FragmentManager.java:3217)
в
android.support.v4.app.FragmentManagerImpl.dispatchCreate (FragmentManager.java:3166)
в
android.support.v4.app.FragmentController.dispatchCreate (FragmentController.java:181)
в
android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:319)
в
android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:84)
на com.test.MainActivity.onCreate (MainActivity.java:364) на
android.app.Activity.performCreate (Activity.java:7084) в
android.app.Activity.performCreate (Activity.java:7075) в
android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1215)
в
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2765)
в
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2890)
на android.app.ActivityThread.-wrap11 (неизвестный источник: 0) на
android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1611)
на android.os.Handler.dispatchMessage (Handler.java:106) на
android.os.Looper.loop (Looper.java:171) в
android.app.ActivityThread.main (ActivityThread.java:6633) в
java.lang.reflect.Method.invoke (родной метод) в
com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:547)
на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823)