Android方向更改会导致事物消失

时间:2011-11-12 09:32:00

标签: android android-layout screen-orientation android-imageview

以下是SimpleCursorAdapter中行模板的布局。

ID next_arrow 的ImageView会在方向更改时永久消失(返回原始方向不会重新显示)。如果我用@ drawable / icon(标准sym_def_app_icon的副本)替换@ drawable / arrow,它可以正常工作。所有可用的drawable都是对PNG文件的简单引用

我认为它可能与图标具有不同的尺寸有关,但是我将@ drawable / icon的大小调整为与箭头完全相同的尺寸,它仍然正常工作,而箭头没有。

更新

好吧,它甚至更奇怪了。我将 arrow.png 重命名为 something_not_called_arrow.png 并且......它可以正常工作。发生了什么事?

这不是我第一次看到这种情况发生。今天早些时候我有另一个可绘制的PNG,它在Eclipse Graphical Layout视图中显示得很好,但在我重命名文件之前,它在模拟器或设备上完全没有显示出来。我尝试清理并刷新项目,然后重新启动Eclipse。

另一次更新

在不同情况下再次发生这种情况。在Activity onCreate()中,我在一些资源上调用findViewById()来配置它们,一切都在第一次加载时正常工作。当由于方向更改而调用onCreate()时,findViewById()将为所有这些资源返回null。这是令人抓狂的,涉及android:configChanges="keyboardHidden|orientation"的答案根本不是真正的解决方案,它们只是掩盖了问题。

在这种情况下,我通过将活动的布局xml从 share.xml 重命名为 share_activity_layout.xml 来“修复”它。我开始认为R文件生成和资源ID管理中存在某种错误。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="90dp"
              android:background="@drawable/product_list_divider"
              android:paddingTop="10dp">

    <ImageView android:src="@drawable/ninja_20_65"
               android:id="@+id/category_icon" 
               android:layout_marginLeft="20dp"
               android:layout_marginRight="20dp"
               android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginTop="3dp"/>

    <LinearLayout android:orientation="vertical"
                  android:layout_weight="5"
                  android:layout_width="0dp"
                  android:layout_height="wrap_content">

        <TextView android:id="@+id/category_name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:text="Name" 
            style="@style/CategoryHeading" android:layout_marginTop="5dp"/>
        <TextView android:id="@+id/category_description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:text="Description"
            style="@style/CategoryDescription"/>
    </LinearLayout>

    <ImageView android:src="@drawable/arrow"
               android:layout_weight="1"
               android:layout_width="0dp"
               android:layout_marginRight="10dp"
               android:layout_height="wrap_content" android:layout_marginTop="20dp" android:id="@+id/next_arrow"/>

</LinearLayout>

我正在使用Android 2.1。

3 个答案:

答案 0 :(得分:2)

我将arrow.png重命名为something_not_called_arrow.png并且有效。

随后出现了类似的问题,我通过将活动的布局xml从share.xml重命名为share_activity_layout.xml来“修复”。

我认为R文件生成和资源ID管理中存在一个错误。

答案 1 :(得分:0)

两个想法。

你的资源文件夹中有另一个名为arrow的drawable吗?当方向发生变化时,android将重新创建活动并重新加载布局和图像。它可能会从某个地方拾取不同的图像。那些可以解释为什么它重命名drawable时它的工作原理。

秒。你为什么把图像宽度设置为0?将它设置为包装内容可能没问题。

答案 2 :(得分:0)

您的资源文件夹中包含许多子目录。

  • drawable&lt; - generic
  • drawable-land&lt; - only portrait
  • drawable-hdpi&lt; ---只有高分辨率
  • drawable-mdpi&lt; ---只有中等分辨率

依旧......

如果你使用R.drawable.arrow,android会调查drawable来加载它。问题是(实际上它是一个特征),如果你处于横向模式,它将首先在drawable-land中看,如果它在那里找不到任何东西,那么只能在drawable之后。 这同样适用于不同的分辨率等。

所以我的猜测是你有可拉乱的土地搞砸了,我鼓励你看看那里是否有任何档案。如果是,请删除它们。

同样适用于布局。