android-support-v4 rev中的片段ID。 22

时间:2015-04-13 11:38:43

标签: android android-fragments android-support-library

有MainActivity(扩展FragmentActivity)和MainActivityFragment(扩展android.support.v4.app.Fragment)。 MainActivityFragment的纵向和横向屏幕方向有不同的布局。

将android-support-v4 lib的版本从21.0.3切换到22.0.0后,我在旋转应用程序时得到以下堆栈跟踪:

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>

因此两个片段布局都有不同的根ID。但似乎在支持-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) - 与rev。 21为纵向模式返回RelativeLayout,横向返回null;与转22在两种模式下都返回null

(2) - 与rev。 21为纵向模式返回null,ScrollView为横向模式;与转22在两种模式下都返回null

(3) - 与rev。 21返回两种模式的片段内部布局;在转22根据方向返回RelativeLayout或ScrollView。

我的问题:API的更改是否记录在某处?假设它不是支持库的错误,我应该更改布局/片段代码吗?

1 个答案:

答案 0 :(得分:1)

我的Android 4.1设备上的Android系统库(不支持-lib-v4)中的Activity和Fragment类具有与最新(22.1.1)版本的support-lib-v4相同的行为。所以,我猜“新”行为不是一个错误,但它是修复。