android横竖屏切换、键盘推出状态改变的处理
2011-10-26 15:38
507 查看
背景介绍:
在编写android小应用的时候,碰到了这样的一个问题:当推开手机的实体键盘时,屏幕由竖屏转换为横屏,此时应用程序的显示界面(Activity)就会被销毁了,这个让人比较郁闷。
如何才能让这个activity不被销毁呢?
------------------------------------- 背景分割线 ---------------------------------------------
资料查询:
在android开发网上有这么几段话:
If the configuration of the device (as defined by the
update to match that configuration. Because Activity is the primary mechanism for interacting with the user, it includes special support for handling configuration changes.
Unless you specify otherwise, a configuration change (such as a change in screen orientation, language, input devices, etc) will cause your current activity to bedestroyed, going through the normal activity lifecycle process of
as appropriate. If the activity had been in the foreground or visible to the user, once
activity will be created, with whatever savedInstanceState the previous instance had generated from
In some special cases, you may want to bypass restarting of your activity based on one or more types of configuration changes. This is done with the
attribute in its manifest. For any types of configuration changes you say that you handle there, you will receive a call to your current activity's
any that you do not handle, however, the activity will still be restarted and
will not be called.
To declare that your Activity handles a configuration change, edit the appropriate
attribute (the most commonly used values are
For example, the following manifest snippet declares an Activity that handles both the screen orientation change and keyboard availability change:
Now when one of these configurations change,
This method is passed a
you can determine the new configuration and make appropriate changes by updating the resources used in your interface. At the time this method is called, your Activity's
Activity.
------------------------------------ 分割线 -----------------------------------------
解决办法:
通过上面资料的阅读,解决办法就很简单了。
首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性
[/code]
加入这条属性的含义是,应用程序将会处理屏幕方向和键盘状态(推出或合上)信息的改动。但对于其他的设备配置信息的改动则会由Android系统来处理(销毁当前Activity,然后重启一个新的Activity实例)。
那么,现在还需要在java代码的activity子类中加入配置信息改动的处理代码。这个也很简单
[/code]
别忘了在java文件中加上 import android.content.res.Configuration。
这样就OK了,屏幕方向改变时,应用程序的显示界面也会随着改动,而不是被销毁!
-----------------------------------还是分割线---------------------------------------------
扩展补充:
Activity中还有一属性和屏幕方向有关:
[/code]
比如,在Mainifest.xml的Activity元素中增加这么一个属性:
android:screenOrientation="portrait"
则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。
android:screenOrientation="landscape“,为横屏显示。
这里提一个小知识,Anroid模拟器中,快捷键"ctrl+F11"可以实现转屏。
横竖屏切换后可采用不同的布局文件,方法如下:
默认情况下(竖屏)是调用res/layout 中的布局,如果要自定义横屏时的布局,可以在res/目录下新建一个layout-land 文件,在这个文件夹中放置横屏的布局,横竖屏的XML
文件的名字必须一样。=====
转自http://www.cnblogs.com/hibraincol/archive/2010/09/18/1829862.html
在编写android小应用的时候,碰到了这样的一个问题:当推开手机的实体键盘时,屏幕由竖屏转换为横屏,此时应用程序的显示界面(Activity)就会被销毁了,这个让人比较郁闷。
如何才能让这个activity不被销毁呢?
------------------------------------- 背景分割线 ---------------------------------------------
资料查询:
在android开发网上有这么几段话:
If the configuration of the device (as defined by the
Resources.Configurationclass) changes, then anything displaying a user interface will need to
update to match that configuration. Because Activity is the primary mechanism for interacting with the user, it includes special support for handling configuration changes.
Unless you specify otherwise, a configuration change (such as a change in screen orientation, language, input devices, etc) will cause your current activity to bedestroyed, going through the normal activity lifecycle process of
onPause(),
onStop(), and
onDestroy()
as appropriate. If the activity had been in the foreground or visible to the user, once
onDestroy()is called in that instance then a new instance of the
activity will be created, with whatever savedInstanceState the previous instance had generated from
onSaveInstanceState(Bundle).
In some special cases, you may want to bypass restarting of your activity based on one or more types of configuration changes. This is done with the
android:configChanges
attribute in its manifest. For any types of configuration changes you say that you handle there, you will receive a call to your current activity's
onConfigurationChanged(Configuration)method instead of being restarted. If a configuration change involves
any that you do not handle, however, the activity will still be restarted and
onConfigurationChanged(Configuration)
will not be called.
To declare that your Activity handles a configuration change, edit the appropriate
<activity>element in your manifest file to include the
android:configChangesattribute with a string value that represents the configuration that you want to handle. Possible values are listed in the documentation for the
android:configChanges
attribute (the most commonly used values are
orientationto handle when the screen orientation changes and
keyboardHiddento handle when the keyboard availability changes). You can declare multiple configuration values in the attribute by separating them with a pipe character ("|").
For example, the following manifest snippet declares an Activity that handles both the screen orientation change and keyboard availability change:
<activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name">
Now when one of these configurations change,
MyActivityis not restarted. Instead, the Activity receives a call to
onConfigurationChanged().
This method is passed a
Configurationobject that specifies the new device configuration. By reading fields in the
Configuration,
you can determine the new configuration and make appropriate changes by updating the resources used in your interface. At the time this method is called, your Activity's
Resourcesobject is updated to return resources based on the new configuration, so you can easily reset elements of your UI without the system restarting your
Activity.
------------------------------------ 分割线 -----------------------------------------
解决办法:
通过上面资料的阅读,解决办法就很简单了。
首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性
[code]<activity android:name=".FileBrowser"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
[/code]
加入这条属性的含义是,应用程序将会处理屏幕方向和键盘状态(推出或合上)信息的改动。但对于其他的设备配置信息的改动则会由Android系统来处理(销毁当前Activity,然后重启一个新的Activity实例)。
那么,现在还需要在java代码的activity子类中加入配置信息改动的处理代码。这个也很简单
[code]/**
* onConfigurationChanged
* the package:android.content.res.Configuration.
* @param newConfig, The new device configuration.
* 当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时,
* 并且如果此时有activity正在运行,系统会调用这个函数。
* 注意:onConfigurationChanged只会监测应用程序在AnroidMainifest.xml中通过
* android:configChanges="xxxx"指定的配置类型的改动;
* 而对于其他配置的更改,则系统会onDestroy()当前Activity,然后重启一个新的Activity实例。
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 检测屏幕的方向:纵向或横向
if (this.getResources().getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE) {
//当前为横屏, 在此处添加额外的处理代码
}
else if (this.getResources().getConfiguration().orientation
== Configuration.ORIENTATION_PORTRAIT) {
//当前为竖屏, 在此处添加额外的处理代码
}
//检测实体键盘的状态:推出或者合上
if (newConfig.hardKeyboardHidden
== Configuration.HARDKEYBOARDHIDDEN_NO){
//实体键盘处于推出状态,在此处添加额外的处理代码
}
else if (newConfig.hardKeyboardHidden
== Configuration.HARDKEYBOARDHIDDEN_YES){
//实体键盘处于合上状态,在此处添加额外的处理代码
}
}
[/code]
别忘了在java文件中加上 import android.content.res.Configuration。
这样就OK了,屏幕方向改变时,应用程序的显示界面也会随着改动,而不是被销毁!
-----------------------------------还是分割线---------------------------------------------
扩展补充:
Activity中还有一属性和屏幕方向有关:
[code]<activity
. . .
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
. . .
</activity>
[/code]
比如,在Mainifest.xml的Activity元素中增加这么一个属性:
android:screenOrientation="portrait"
则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。
android:screenOrientation="landscape“,为横屏显示。
这里提一个小知识,Anroid模拟器中,快捷键"ctrl+F11"可以实现转屏。
横竖屏切换后可采用不同的布局文件,方法如下:
默认情况下(竖屏)是调用res/layout 中的布局,如果要自定义横屏时的布局,可以在res/目录下新建一个layout-land 文件,在这个文件夹中放置横屏的布局,横竖屏的XML
文件的名字必须一样。=====
layout-port和layout-land ----- 在activity中做判断,代码如下: Configuration newConfig = getResources().getConfiguration();" w/ j4 `: ]5 S0 ~) \/ D+ | if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){ //横屏时 setContentView(R.id.landscape); }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ //竖屏时 setContentView(R.id.portrait);( o) y' l/ e3 \& \2 u }6 |
相关文章推荐
- android横竖屏切换、键盘推出状态改变的处理
- Android中配置改变(Configuration)的处理状态(重点横竖屏切换)
- Android中配置改变(Configuration)的处理状态(重点横竖屏切换)
- Android系统移植与调试之------->如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
- 【Android每周专题】横竖屏切换和Activity中View状态的保持
- Android横竖屏切换时,状态和信息的维护
- android横竖屏切换总结-布局改变和数据保存
- android: 横竖屏切换总结-布局改变和数据保存
- android 软键盘弹出移动view 键盘监听兼容横竖屏切换
- android 的数据状态保存,横竖屏切换时的操作
- Android键盘处理-监听键盘状态并实现QQ拉出式弹出回复框。
- android(34)(有序广播、无序广播、中断特定号码广播、监听SD卡状态、横竖屏切换)
- Android 横竖屏切换 状态保留
- Android监听软键盘显示与隐藏状态来动态改变布局
- 如何避免打开键盘或横竖屏切换,active重启,处理界面的延迟动画
- android网络监听状态改变收到2个广播处理
- Android横竖屏切换改变布局
- Android应用横竖屏切换处理
- 语言切换,横竖屏切换,物理键盘推出导致activity重启原因分析和问题解决
- Android横竖屏切换处理