【问题标题】:Change Android layout with Fragments使用 Fragments 更改 Android 布局
【发布时间】:2013-04-16 16:41:40
【问题描述】:

我正在开发一个包含两个 Fragment 的 Android Activity。 Activity 有两种可能的布局,一种在 Portait,另一种在 Landscape。

我创建的片段运行良好,但是当我更改手机/平板电脑的方向时遇到问题。

其中一个 Fragment 是 ListFragment,带有一个 AsyncTask,用于从 Web 加载列表数据。有了这个片段,我就没有问题了,因为我可以再次创建它。 (虽然加载需要一些时间)。

另一个片段里面有一个谷歌地图V2片段:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/mapInicio"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />

</LinearLayout>

我从FragmentActivityonCreate 方法创建片段:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_inicio);



    Fragment listFragment = new ListaEstaciones();
    FragmentTransaction transList = getSupportFragmentManager()
            .beginTransaction();
    transList.add(R.id.listaestaciones_f_container, listFragment);
    transList.commit();



    Fragment mapFragment = new MapaGoogleV2();
    FragmentTransaction transMap = getSupportFragmentManager()
            .beginTransaction();
    transMap.add(R.id.mapa_f_container, mapFragment);
    transMap.commit();



}

onConfigurationChanged 方法中,我有这段代码。与onCreate 一样,我创建了片段,并更改了视图,因为现在我们处于横向/纵向:

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);


    setContentView(R.layout.activity_inicio);

    Fragment listFragment = new ListaEstaciones();
    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();
    transaction.add(R.id.listaestaciones_f_container, listFragment);
    transaction.commit();



    Fragment mapFragment = new MapaGoogleV2();
    FragmentTransaction transMap = getSupportFragmentManager()
            .beginTransaction();
    transMap.add(R.id.mapa_f_container, mapFragment);
    transMap.commit();

}

当我在此方法中创建 ListFragment 时效果很好,但不适用于 MapFragment。 Fragment with a MaponCreateView 方法中的应用程序崩溃。我想我不能再膨胀这个片段了:

04-16 18:20:32.795: E/AndroidRuntime(15543): android.view.InflateException: Binary XML file line #6: Error inflating class fragment

我的问题:

有没有办法在更改布局时避免重新创建片段?

我该怎么做?

谢谢!

【问题讨论】:

标签: android android-fragments google-maps-android-api-2 onconfigurationchanged


【解决方案1】:

如果不使用onConfigurationChanged方法,是无法避免Activity被破坏的,但是这种解决方案有时很难处理。

在网上研究后,我发现一个very interesting article 谈论如何手动处理碎片的重新创建,但是这个解决方案不适用于我的地图碎片。

我的最终解决方案是让 Android 自动更改布局,从清单中删除 android:configChanges=”orientation”

另外,我不能使用包含 Google Map V2 的地图片段。我直接使用了 Google Map V2 片段。

要保留Fragment的实例,只需输入指令setRetainInstance(true)

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_inicio);

    Fragment listFragment = new ListaEstaciones();
    listFragment.setRetainInstance(true);
    FragmentTransaction transList = getSupportFragmentManager()
        .beginTransaction();
    transList.add(R.id.listaestaciones_f_container, listFragment);
    transList.commit();
}

感谢您的帮助。

【讨论】:

  • 感谢 android:configChanges=”orientation” 这一行在活动清单中定义我的问题已解决...!!!
【解决方案2】:

如果您只需要纵向和横向的不同布局,有一种更简单的方法可以做到这一点。创建一个文件夹 layout-land 并将布局 XML 放在那里,用于您想要在横向中指定不同布局的任何片段/活动。 Android 将根据方向处理要使用的布局。 Check out this page developer.android.com 了解更多信息。

Here's another example 我的意思。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多