onConfigurationChanged重定向的布局

时间:2013-09-21 18:11:09

标签: android layout screen-orientation onconfigurationchanged

我有一个图像查看器应用程序,可以处理具有重要缓存的非常大的图像。当用户旋转设备时,如果应用完全重启,则会导致打嗝。

如果我禁用方向更改,那么设备旋转是无缝的,但我有一个侧边栏,在横向和纵向方向不同。由于方向更改被禁用,侧边栏将保持在以前的状态,占用大量的房地产。

有没有办法让布局方面在轮换时更新而不完全重新启动活动?


编辑(更多信息)


我正在添加更多信息以使我的原始问题更清晰,以便我可以回答它。布局如下:

 ___ _
|   | |
| V |S|  Landscape
|___|_|

 ___
|   |
| V |
|___|   Portrait
|_S_|

V =观众 S =边栏

侧边栏是相同的片段,但它根据方向使用不同的布局。我最初的尝试是一个复杂的多布局设置。当我允许活动在方向更改时重新启动时,这工作正常。但是,由于我不想重新发布所有繁重的工作(或添加实例节省开销),我需要找到一种方法来调整方向更改的布局,而无需完全重启。

2 个答案:

答案 0 :(得分:1)

将此行放入清单的活动代码

android:configChanges="orientation"

答案 1 :(得分:1)

我最终做的是调整布局以使用空容器处理横向和纵向,稍后将填充正确的片段:

<RelativeLayout>
   ...
   <FrameLayout
       android:id="@+id/xmpRightContainer"
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
       android:layout_alignParentRight="true"  >
   </FrameLayout>

   <FrameLayout
       android:id="@+id/xmpBottomContainer"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"  >
   </FrameLayout>
</RelativeLayout>

在onConfigurationChanged:

    if (xmpFrag != null)
    {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.remove(getSupportFragmentManager().findFragmentByTag(XmpFragment.FRAGMENT_TAG));
        ft.commit();
        fm.executePendingTransactions();
    }

    xmpFrag = new XmpFragment();
    int container;
    boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
    if (isPortrait)
    {
        container = R.id.xmpBottomContainer;
    }
    else
    {
        container = R.id.xmpRightContainer;
    }

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(container, xmpFrag, XmpFragment.FRAGMENT_TAG);      
    ft.commit();
    fm.executePendingTransactions();

这非常有效,现在旋转设备对用户来说是无缝的。