Android orientation change causes things to disappear

守給你的承諾、 提交于 2019-12-23 06:07:03

问题


Below is my layout for the row template in a SimpleCursorAdapter.

The ImageView with id next_arrow disappears permanently on orientation change (going back to original orientation doesn't make it re-appear). If I replace @drawable/arrow with @drawable/icon (copy of the standard sym_def_app_icon) it works fine. All the drawables in question are simple references to PNG files.

I thought it might be somehow related to the icons being of different dimensions, but I resized @drawable/icon to be the exact same dimensions as the arrow and it still worked fine while the arrow didn't.

Update

Okay it gets even weirder. I renamed the arrow.png to something_not_called_arrow.png and... it works. What is going on?

This isn't the first time I've seen this happen. Earlier today I had another drawable PNG that showed fine in the Eclipse Graphical Layout view, but refused to show up at all in the Emulator or on a device until I renamed the file. I tried cleaning and refreshing the project, and restarting Eclipse.

Another Update

Just had this happen again in a different situation. In Activity onCreate() I call findViewById() on a few resources to configure them, everything works fine on first load. When onCreate() is called due to an orientation change, findViewById() returns null for all these resources. This is maddening, and the answers that involve android:configChanges="keyboardHidden|orientation" aren't real solutions at all, they are just masking the problem.

In this case I "fixed" it by renaming the layout xml for the activity from share.xml to share_activity_layout.xml. I'm starting to think there is some kind of bug in the R file generation and resource ID management in general.

<?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>

I'm using Android 2.1.


回答1:


I renamed the arrow.png to something_not_called_arrow.png and it works.

There was a subsequent similar issue which I "fixed" by renaming the layout xml for the activity from share.xml to share_activity_layout.xml.

I think there is a bug in the R file generation and resource ID management in general.




回答2:


Two thoughts.

is there another drawable in your resource folder called arrow? when the orientation change occurs android will recreate the activity and reload the layout and images. it may be picking up a different image from somewhere. those could explain why it works when you rename the drawable.

second. why did you set the image width to 0? it will probably be ok to set it to wrap content.




回答3:


Your resource folder is has many sub-directories in it.

  • drawable <-- generic
  • drawable-land <-- only portrait
  • drawable-hdpi <--- only high resolution
  • drawable-mdpi <--- only medium resolution

and so on..

if you use R.drawable.arrow, android will look into drawable to load it. The problem is (and actually it's a feature), that if you're in landscape mode it will look first in drawable-land and, if it can't find anything there, only after in drawable. The same applies to different resolutions, etc.

So my guess is you have drawable-land messed up and I encourage you to give a look there to see if there is any file. If so, delete them.

Same applies for the layouts.



来源:https://stackoverflow.com/questions/8103639/android-orientation-change-causes-things-to-disappear

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!