我无法在我的应用程序中设置横向模式。
我有一个/ res文件夹,其中包含布局文件夹和layout-land文件夹
layout
-----main.xml
layout-land
-----main.xml
我的/layout-land/main.xml包含与/layout/main.xml不同的UI元素。当用户切换到横向模式时,如何正确映射每个布局,反之亦然?
当用户切换到横向模式时,我基本上会显示全屏幕ImageView。 ImageView将从互联网上下载图像并显示它。切换回肖像,应该回到我的肖像模式,它具有不同的UI组件集。
当我切换到横向模式时,我遇到了崩溃:
因为我无法获得id:
chartImageViewLandscape = (ImageView) this.findViewById(R.id.chartImageViewLandscape);
chartImageViewLandscape位于/layout-land/main.xml
我如何获得对此的引用?
答案 0 :(得分:1)
究竟是什么问题?
您是否在两个布局中定义了android:orientation
?除此之外,别无他法。 Android会自行切换。
如果您有不同的UI组件,您可能仍希望在两种布局中声明它们,以便对findViewById
的任何调用都不会使您的应用程序崩溃。只需进行布局,使其不显示(例如在FrameLayout中,在图像后面)
如果您希望手动执行此操作,则需要在清单中加android:configChanges="orientation"
并实施onConfigurationChanged
答案 1 :(得分:1)
Sheehan,关于onRetainNonConfigurationInstance(),下面是我正在为正在进行的应用程序做的事情。虽然我觉得我过于复杂,但我觉得有一种更简单的方式;但是,这对我来说效果很好:
所以在我的活动类“RotationMenu.java”中:
private Object catcher;
//lots of non-related code here
//directoryList is a returned list of selected directories, that I wish to
//retain in the event of an orientation state change.
String[] directoryList = new String[arrayList.size()];
arrayList.toArray(directoryList);
//here, I set the class Object catcher to the directoryList
catcher = directoryList;
//rest of non-related code
//this method is called when the orientation changes (for me,
//when I open my Droid's hardware keyboard)
public Object onRetainNonConfigurationInstance()
{
//If I've entered anything into my catcher Object, it will be kept
//across orientation changes.
final Object data = catcher;
return data;
}
现在,在我的onCreate(Bundle savedInstanceState)方法中:
//We retrieve the stored Object and cast it to a String array
final Object recipient = (String[]) getLastNonConfigurationInstance();
//in case the state changes again before the code that sets the directories is run
catcher = recipient;
//if there was any stored data, we can now reinstate the list adapter where the
//directoryList was originally being used.
if(recipient != null)
{
returnedDirectories.setAdapter(new ArrayAdapter<String>(
this.getBaseContext(),
R.layout.simple_list_item_small,
(String[])recipient));
}
同样,这就是我目前正在做的事情。如果有人知道更有效的方法,一定要评论。 :)
答案 2 :(得分:0)
这来自AdMob活动,并且有更多参数,例如screenSize适用于Android 3.2 +
<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
答案 3 :(得分:0)
转到您的Android&#34;清单&#34; xml文件,并确保&#34;活动&#34;中存在以下内容:部分:
android:configChanges="orientation|screenSize|keyboardHidden"
您的最终&#34;活动&#34;清单的部分应类似于以下内容:
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>