我有一个图像查看器应用程序,可以处理具有重要缓存的非常大的图像。当用户旋转设备时,如果应用完全重启,则会导致打嗝。
如果我禁用方向更改,那么设备旋转是无缝的,但我有一个侧边栏,在横向和纵向方向不同。由于方向更改被禁用,侧边栏将保持在以前的状态,占用大量的房地产。
有没有办法让布局方面在轮换时更新而不完全重新启动活动?
编辑(更多信息)
我正在添加更多信息以使我的原始问题更清晰,以便我可以回答它。布局如下:
___ _
| | |
| V |S| Landscape
|___|_|
___
| |
| V |
|___| Portrait
|_S_|
V =观众 S =边栏
侧边栏是相同的片段,但它根据方向使用不同的布局。我最初的尝试是一个复杂的多布局设置。当我允许活动在方向更改时重新启动时,这工作正常。但是,由于我不想重新发布所有繁重的工作(或添加实例节省开销),我需要找到一种方法来调整方向更改的布局,而无需完全重启。
答案 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();
这非常有效,现在旋转设备对用户来说是无缝的。