Android横竖屏要解决的问题应该就两个:1.布局问题;2.重新载入问题。
1.布局问题:
如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:
"unspecified"
默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
"landscape"
横屏显示(宽比高要长)
"portrait"
竖屏显示(高比宽要长)
"user"
用户当前首选的方向
"behind"
和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
"sensor"
有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
"nosensor"
忽略物理感应器,这样就不会随着用户旋转设备而更改了 ( "unspecified"设置除外 )。
也可以在Java代码中通过setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);来设置。
如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局:
1)在res目录下建立layout-land和layout-port目录,相应的layout文件不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,模拟器会自动寻找。
2)通过this.getResources().getConfiguration().orientation来判断当前是横屏还是竖屏然后来加载相应的xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的 OnCreate中来检查当前的方向,然后可以让你的SetContentView来载入不同的Layout xml.
Java代码 收藏代码
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.i(TAG, "landscape");
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Log.i(TAG, "portrait");
}
这里提一个小知识,Anroid模拟器中,快捷键"ctrl+F11"可以实现转屏。
2.重新载入问题。
以下解决方案主要是针对切换不同的视图时而不需重新加载activity里的数据而设计的,当切换视图是只要做相应的处理就不会在此执行onCreate方法
到网上搜了下面这篇靠谱的文章,另外想实现横竖屏不同布局的切换可以通过创建layout-land和layout-port文件夹,然后他们里面放同名的xml布局文件即可实现
首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性
Java代码 收藏代码
<activity android:name=".MyActivity"
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>
其次添加权限
Xml代码 收藏代码
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
现在还需要在java代码的activity子类中加入配置信息改动的处理代码:
Java代码 收藏代码
/**
* 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) {
// 实体键盘处于合上状态,在此处添加额外的处理代码
}
}
这样就OK了,屏幕方向改变时,应用程序的显示界面也会随着改动,而不是被销毁!
补充:
1.configChanges有如下选项: 1. orientation :屏幕在纵向和横向间旋转, 2. keyboardHidden:键盘显示或隐藏 ,3.fontScale:用户变更了首选的字体大小 4.locale : 用户选择了不同的语言设定,5. keyboard :键盘类型变更,例如手机从12键盘切换到全键盘 6. touchscreen或navigation:键盘或导航方式变化。
2.如果缺少了keyboardHidden选项 不能防止Activity的销毁,并且在之后提到的onConfigurationChanged事件中 只能捕获竖屏变横屏的事件 不能捕获横屏变竖屏

更多相关文章

  1. android之resources资源
  2. Android实现图表绘制和展示
  3. Android入门第十六篇之Style与Theme
  4. 如何创建QuickAction在Android对话 类似于苹果的效果
  5. 利用任务调度特性检测Android模拟器
  6. Android高手进阶教程(八)之----Android(安卓)Widget开发案例(世
  7. Android如何完全调试framework层代码
  8. android Widget添加过程和android添加widget不更新的问题分析解
  9. Android学习日记----------Android(安卓)10调用摄像头闪退问题--

随机推荐

  1. android 中activity 属性说明
  2. android 多种特效TextView
  3. Android 中级教程之------Android MediaP
  4. mono for android 百度map binding项目
  5. Android 进阶之 Android消息机制Handler
  6. Android NDK会带来什么,除去你对NDK的一些
  7. Android自动化工具Monkeyrunner使用(五)
  8. Android中Activity的四种启动模式详解
  9. Android Binder
  10. 安卓017ListView & GridView & ScrollView