2015-04-13 4 views
3

Есть 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 документированным где-то? Должен ли я изменить свой код макета/фрагмента, полагая, что это не ошибка библиотеки поддержки?

ответ

1

Занятия и классы фрагментов из системной библиотеки Android (а не поддержки-lib-v4) на моем устройстве Android 4.1 имеют такое же поведение, как и новая версия версии поддержки lib-v4 (22.1.1). Итак, я думаю, что «новое» поведение не является ошибкой, но это исправление.