Android OnConfiguration已更改重新排列方向布局
我有一个图像查看器应用程序,它可以处理带有大量缓存的非常大的图像。当用户旋转设备时,如果应用程序完全重新启动,将导致打嗝 如果我禁用方向更改,那么设备旋转是无缝的,但是我有一个侧边栏,在横向和纵向方向上是不同的。由于方向改变被禁用,侧边栏将保持原来的状态,吞噬大量的不动产 是否有一种方法可以允许布局方面在不完全重新启动活动的情况下在轮换时更新Android OnConfiguration已更改重新排列方向布局,android,layout,screen-orientation,onconfigurationchanged,Android,Layout,Screen Orientation,Onconfigurationchanged,我有一个图像查看器应用程序,它可以处理带有大量缓存的非常大的图像。当用户旋转设备时,如果应用程序完全重新启动,将导致打嗝 如果我禁用方向更改,那么设备旋转是无缝的,但是我有一个侧边栏,在横向和纵向方向上是不同的。由于方向改变被禁用,侧边栏将保持原来的状态,吞噬大量的不动产 是否有一种方法可以允许布局方面在不完全重新启动活动的情况下在轮换时更新 编辑(更多信息) 我正在添加更多的信息,使我原来的问题更清楚,这样我就可以回答它。布局如下: ___ _ | | | | V |S| Land
编辑(更多信息)
我正在添加更多的信息,使我原来的问题更清楚,这样我就可以回答它。布局如下:
___ _
| | |
| V |S| Landscape
|___|_|
___
| |
| V |
|___| Portrait
|_S_|
V=查看器
S=侧栏
侧边栏是相同的片段,但是它根据方向使用不同的布局。我最初的尝试是一个复杂的多布局设置。当我允许活动在方向更改时重新启动时,这种方法效果很好。但是,由于我不想重新发布所有繁重的内容(或添加实例保存开销),我需要找到一种方法,在方向更改时调整布局,而无需完全重新启动。将此行放入清单的活动标记中
android:configChanges="orientation"
我最后做的是调整布局,以处理带有空容器的横向和纵向布局,这些空容器稍后将填充适当的碎片:
<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>
这项功能非常有效,现在对用户来说,旋转设备是无缝的。使用onpause()和on resume()方法管理这些内容。实际上,这个问题远不止于此。我澄清了问题,并补充了我最终得出的解决方案。
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();