屏幕旋转后Android片段重叠
Posted
技术标签:
【中文标题】屏幕旋转后Android片段重叠【英文标题】:Android fragments overlapping after screen rotation 【发布时间】:2012-03-11 07:33:49 【问题描述】:这个应用程序是我使用片段等进行的学习练习。它有一个单独的活动来管理一些不同的片段。第一个是 ListFragment (A),它显示应用程序何时启动并从光标加载列表项。单击列表项会通知 Activity 将 ListFragment 替换为该项目的 DetailFragment (B)。如果在查看 (B) 时旋转屏幕,我看到 (B) 在 (A) 的顶部,如下所示:
http://postimage.org/image/uhy016ds7/
我最好的猜测是它与 android 在配置更改时销毁和重新创建活动有关。我想知道这个问题最干净的解决方案是什么。下面是一些代码 sn-ps,如果我应该发布其他内容,请告诉我。
res/layout/home.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_
android:layout_ >
<fragment
android:id="@+id/fragment_place_list"
android:name="com.simbiosys.apps.foodfast.ui.PlaceListFragment"
android:layout_
android:layout_ >
</fragment>
</FrameLayout>
MyActivity.onCreate
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
placeListFragment = (PlaceListFragment) getSupportFragmentManager().findFragmentById(
R.id.fragment_place_list);
MyActivity.showDetailPane
public void showDetailPane(String id, String reference)
placeDetailFragment = PlaceDetailFragment.newInstance(id, reference);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.addToBackStack(null);
ft.hide(placeListFragment);
ft.replace(R.id.fragment_container, placeDetailFragment);
ft.show(placeDetailFragment);
ft.commit();
【问题讨论】:
你看过alternative resources
吗? developer.android.com/guide/topics/resources/…
嗯,我现在专注于手机屏幕。无论如何,ListFragment 的布局在横向上不会有任何不同。事实上,ListFragment 没有布局 xml,因为它目前只有内置的 ListView。
【参考方案1】:
根据 Android 开发人员page,在 Activity 的 onCreate 方法中,您应该在将片段添加到 Activity 之前检查 savedInstanceState 是否为空。 this page Activity 的 onCreate 方法的代码 sn-p 说明。
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
if (savedInstanceState != null)
return;
【讨论】:
谢谢,完美运行,在挣扎了 2 小时后救了我 另请注意,本指南使用 FrameLayout。【参考方案2】:这是因为您使用框架布局作为容器。 它不会与其他布局重叠。
您想要实现的最佳实践是将 XML 文件放入您的 layout/ 文件夹中,其中仅使用您的 listfragment。 在您的 layout-land/ 中,您放置了一个 XML 文件,其中包含使用和排列的片段。
然后系统处理所有的创建。碎片。而且您的活动基本上减少为 setContentView() 调用。
在列表项上单击,然后向片段管理器检查您的详细片段是否已创建。如果它是创建的,您可以在详细信息片段中调用一个公共函数来设置数据。
如果未创建,则使用新活动创建意图。
我知道 2 个很好的教程:android 开发者页面上的 Fragments 页面和 vogella.de 都将为您提供详细的示例/教程。
【讨论】:
感谢您指出它是 FrameLayout。但是,我试图不开始另一项活动,因为这项活动正在做一些其他的幕后工作。也就是说,你给了我一两个想法来解决,所以谢谢。 我知道这是一个旧答案,但事实证明它很有帮助。你知道为什么 FrameLayout 会出现这个问题吗?【参考方案3】:把FrameLayout换成LinerLayout,问题就解决了。
这是一个 FrameLayout 相关的问题。
【讨论】:
【参考方案4】:这对我有用。
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
....
fragment = getFragmentManager().findFragmentByTag(TAG);
if(fragment == null) fragment = new Fragment();
....
【讨论】:
以上是关于屏幕旋转后Android片段重叠的主要内容,如果未能解决你的问题,请参考以下文章
Android 片段不保存状态,在旋转/屏幕锁定/返回时崩溃
在recyclerview片段Reandroid中屏幕旋转后进度条不显示