Vid*_*nes 282 android android-orientation android-activity
我有一个应用程序,我只想在纵向模式下使用,所以我在清单XML中定义了android:screenOrientation ="portrait".这适用于HTC Magic手机(并防止其他手机上的方向更改).
但是当我打开硬件QWERTY键盘(而不是虚拟键盘)时,我的HTC G1手机有问题.我的活动保持纵向模式,但它似乎重新启动并失去所有状态.HTC Hero版本不会发生这种情况.
我的应用程序非常大,因此我不希望它在键盘打开时重新启动并丢失所有状态.我怎么能防止这种情况?
Int*_*ons 315
2013年4月更新:不要这样做.2009年我第一次回答这个问题并不是一个好主意,现在真的不是一个好主意.由hackbod看到这个答案的原因:
避免在android中的方向更改时使用asynctask重新加载活动
添加android:configChanges="keyboardHidden|orientation"到您的AndroidManifest.xml.这告诉系统您将自己处理哪些配置更改 - 在这种情况下无需执行任何操作.
<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation">
Run Code Online (Sandbox Code Playgroud)
有关 更多详细信息,请参阅开发人员参考configChanges.
但是,您的应用程序可以随时中断,例如通过电话呼叫,因此您应该添加代码以在应用程序暂停时保存应用程序的状态.
更新:从Android 3.2开始,您还需要添加"screenSize":
<activity
android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize">
Run Code Online (Sandbox Code Playgroud)
从开发人员指南处理配置更改自己
注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,"屏幕大小"也会更改.因此,如果要在开发API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明)时由于方向更改而阻止运行时重新启动,则除了"orientation"值之外,还必须包含"screenSize"值.也就是说,你必须申报
android:configChanges="orientation|screenSize".但是,如果您的应用程序的目标是API级别12或更低,那么您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动).
ube*_*kel 94
您需要将AndroidManifest.xml修改为Intrications(以前称为Ashton),并确保活动处理onConfigurationChanged事件,因为您需要处理它.它应该是这样的:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Run Code Online (Sandbox Code Playgroud)
m00*_*sey 39
我总是发现你需要两者
android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
Dmi*_*sev 22
如上所述,将android:configChanges您的Activity(在清单文件中)设置为keyboardHidden|orientation然后:
1)覆盖 onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//here you can handle orientation change
}
Run Code Online (Sandbox Code Playgroud)
2)将此行添加到您的活动中 onCreate()
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)
这比添加相同的线更好onConfigurationChanged,因为你的应用将转为纵向模式,然后回到横向(它只会发生一次,但它很烦人).
您也可以android:screenOrientation="nosensor"为您的活动设置(在清单中).但是使用这种方式你根本无法处理方向变化.
Num*_*nor 13
在您的活动的OnCreate方法中使用以下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Run Code Online (Sandbox Code Playgroud)
现在,您的方向将设置为纵向,永远不会改变.
Gil*_*len 10
在AndroidManifest.xml文件中,对于要锁定的每个活动,添加最后screenOrientation一行:
android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >
Run Code Online (Sandbox Code Playgroud)
或者android:screenOrientation ="landscape".
在你的androidmanifest.xml文件中:
<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
Run Code Online (Sandbox Code Playgroud)
要么
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Run Code Online (Sandbox Code Playgroud)
要通过代码锁定屏幕,您必须使用屏幕的实际旋转(0,90,180,270),您必须知道它的自然位置,在智能手机中,自然位置将是纵向和平板电脑,这将是风景.
这是代码(锁定和解锁方法),它已经在一些设备(智能手机和平板电脑)中进行了测试,效果很好.
public static void lockScreenOrientation(Activity activity)
{
WindowManager windowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
Configuration configuration = activity.getResources().getConfiguration();
int rotation = windowManager.getDefaultDisplay().getRotation();
// Search for the natural position of the device
if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&
(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||
configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&
(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))
{
// Natural position is Landscape
switch (rotation)
{
case Surface.ROTATION_0:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case Surface.ROTATION_90:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_180:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
case Surface.ROTATION_270:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
}
}
else
{
// Natural position is Portrait
switch (rotation)
{
case Surface.ROTATION_0:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case Surface.ROTATION_90:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case Surface.ROTATION_180:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_270:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
}
}
}
public static void unlockScreenOrientation(Activity activity)
{
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
240742 次 |
| 最近记录: |