Есть MainActivity (extends FragmentActivity) и MainActivityFragment (расширяет android.support.v4.app.Fragment). Существуют различные макеты для ориентации портретного и ландшафтного экрана для MainActivityFragment.Фрагмент id в android-support-v4 rev. 22
После переключения версии андроида-поддержки-v4 Lib от 21.0.3 до 22.0.0 Я получаю следующее StackTrace, вращая приложение:
java.lang.RuntimeException: Unable to start activity
...
Caused by: java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ScrollView$SavedState
at android.widget.ScrollView.onRestoreInstanceState(ScrollView.java:1758)
at android.view.View.dispatchRestoreInstanceState(View.java:13740)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2887)
at android.view.View.restoreHierarchyState(View.java:13718)
at android.support.v4.app.Fragment.restoreViewState(Fragment.java:465)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:979)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1118)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1927)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:544)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236)
at android.app.Activity.performStart(Activity.java:6006)
...
activity_main.xml:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment"
android:name="com.example.myapplication.MainActivityFragment"
tools:layout="@layout/fragment_main"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
макет/fragment_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:id="@+id/relativeLayout"
tools:context=".MainActivityFragment">
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
макета земли/fragment_main.xml:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:id="@+id/scrollView"
tools:context=".MainActivityFragment">
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</ScrollView>
Так как макеты фрагментов имеют разные корневые идентификаторы. Но, похоже, это уже не имеет значения в support-lib-v4 22.0.0. Кроме того, можно найти корневой вид обоих макетов только путем передачи R.id.fragment. Вот код и см. Пояснения ниже:
public class MainActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
findViewById(R.id.relativeLayout); // (1)
findViewById(R.id.scrollView); // (2)
findViewById(R.id.fragment); // (3)
}
}
(1) - с оборотом. 21 возвращает RelativeLayout для портретного режима, null в ландшафте; с оборотом. 22 возвращают нуль в обоих режимах
(2) - с оборотом. 21 возвращает null для портретного режима, ScrollView в ландшафте; с оборотом. 22 возвращать нуль в обоих режимах
(3) - с оборотом. 21 возвращает макет с фрагментом внутри для обоих режимов; в rev. 22 возвращает RelativeLayout или ScrollView в зависимости от ориентации.
Мои вопросы: Является ли это изменение API документированным где-то? Должен ли я изменить свой код макета/фрагмента, полагая, что это не ошибка библиотеки поддержки?