屏幕重定向时Android View渲染错误?

时间:2014-06-11 18:26:27

标签: android android-layout android-fragments

我在一个非常基本的应用程序上得到了这种奇怪的行为,在屏幕重定向后视图呈现错误。

当视频显示时,屏幕重定向(活动销毁/创建,因为它不拦截这些事件)时,应用程序中的代码按预期工作。

当屏幕重新定向时,视图正常工作,只有重叠定位后的重叠鬼影图像。它看起来像是一个“被烧毁”的CRT鬼影。

以任何方向启动应用程序都能正常工作,只有当屏幕在运行时重新定向时才会出现此问题。

视图在Fragment中使用,Fragment是其Activity中唯一的视图。它对ListView,DatePicker和TextView都是一样的。

多个设备出现此问题: - nexus 4运行4.4.3股票android - 三星galaxy s运行cyanogenmod 10.2.1(android 4.3.1) - “galaxy nexus”AVD,API等级为18(android 4.3)

知道这里发生了什么吗?有哪些更多信息可用于排除故障?

屏幕截图如下:

landscape, multiple Views in layout

portrait, ListView

下面的ListView示例的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_expenses"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- Row for Buttons -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="3dp" >

        <Button
            android:id="@+id/list_expenses_button_add"
            android:layout_width="0dip"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="@string/label_button_listexpenses_add" />

     </LinearLayout>

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@android:id/empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/label_listexpenses_noexpenses"
        android:gravity="center" />
</LinearLayout>

1 个答案:

答案 0 :(得分:1)

问题在于,由于Activity类中的以下代码,片段被重复添加到布局中,导致视图重叠(毕竟不是渲染错误):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_expenses);

    if (getSupportFragmentManager().findFragmentById(R.id.list_expenses) == null) {
        fragment = ListExpensesFragment.newInstance();
        getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commit();
    } else {
        fragment = getSupportFragmentManager().findFragmentById(R.id.list_expenses);
    }
}

解决方案:getSupportFragmentManager().beginTransaction().add()的号召替换为getSupportFragmentManager().beginTransaction().replace()