如果设备的配置(在 Resources.Configuration 中进行了定义)发生改变,那么所有用户界面上的东西都需要进行更新,以适应新的配置。因为 Activity 是与用户交互的最主要的机制,它包含了处理配置改变的专门支持。除非你特殊指定,否则当配置发生改变(比如屏幕方向、语言、输入设备等等的改变)时你当前的 activity 都将被销毁,这销毁是通过一个正常的activity 生命周期过程( onFreeze(Bundle) , onPause() , onStop() , 和 onDestroy() )进行的。如果 activity 之前正在前景画面,当这个实例的 onDestroy() 调用完成后将会启动这个 activity 的一个新的实例,并将前面那个实例中 onFreeze(Bundle) 所保存的内容传递给新的实例。因为任何的应用资源(包括 layout 文件)都有可能由于任何配置值而改变。因此处理配置改变的唯一安全的方法就是重新获取所有的资源,包括 layout 、绘图资源(原文 drawables )、字符串资源。由于 activity 已经如何保存自己的状态并从这些状态中重建自身,所以 activity 重新启动自身来获得新的配置将是一个非常便利的途径。在一些特殊的情况中,你可能希望当一种或者多种配置改变时避免重新启动你的 activity 。你可以通过在manifest中设置android:configChanges 属性来实现这点。你可以在这里声明 activity 可以处理的任何配置改变,当这些配置改变时不会重新启动 activity ,而会调用 activity 的 onConfigurationChanged(Resources.Configuration) 方法。如果改变的配置中包含了你所无法处理的配置(在 android:configChanges 并未声明),你的 activity 仍然要被重新启动,而onConfigurationChanged(Resources.Configuration) 将不会被调用。

下面给出两个例子说明屏幕的改变事件。

1.点击按钮改变屏幕的方向

实现的截图如下:

实现这个例子用到的代码如下:

public class EX05_22 extends Activity
{private TextView mTextView01;private Button mButton01;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);/* 方法又需要用到的Display对象 */final Display defaultDisplay = getWindow().getWindowManager().getDefaultDisplay();mButton01 = (Button)findViewById(R.id.myButton1); mTextView01 = (TextView)findViewById(R.id.myTextView1);if(getRequestedOrientation()==-1){mTextView01.setText(getResources().getText(R.string.str_err_1001));}/* 当按下按钮旋转屏幕画面 */mButton01.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View arg0){/* 方法一:重写getRequestedOrientation *//* 若无法取得screenOrientation属性 */if(getRequestedOrientation()==-1){/* 提示无法进行画面旋转叫能,帆无法??Orientation */mTextView01.setText(getResources().getText(R.string.str_err_1001));}else{if(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){/* 若当前为横式,则变更为直式显示 */setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);}else if(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){/* 若当前为直式,则变更为横式显示 */setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}}/* 方法二:判断屏幕宽高比(扩展学习) */int h= defaultDisplay.getHeight();int w = defaultDisplay.getWidth();/* 否分辨率为按钮按下当下的分辨率 */mTextView01.setText(Integer.toString(h)+"x"+Integer.toString(w));//if(w > h)//{/* Landscape *//* 重写Activity里的setRequestedOrientation()方法 *///  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//}//else//{/* Portrait *///  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//}}      });}@Overridepublic void setRequestedOrientation(int requestedOrientation){// TODO Auto-generated method stub/* 判断要变更的方向,以Toast提示 */switch(requestedOrientation){case (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE):mMakeTextToast(getResources().getText(R.string.str_msg1).toString(),false);break;case (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT):mMakeTextToast(getResources().getText(R.string.str_msg2).toString(),false);break;}super.setRequestedOrientation(requestedOrientation);}@Overridepublic int getRequestedOrientation(){// TODO Auto-generated method stub/* 此重写getRequestedOrientation方法,可取得当前屏幕的方向 */return super.getRequestedOrientation();}public void mMakeTextToast(String str, boolean isLong){if(isLong==true){Toast.makeText(EX05_22.this, str, Toast.LENGTH_LONG).show();}else{Toast.makeText(EX05_22.this, str, Toast.LENGTH_SHORT).show();}}
}

2.动态改变屏幕的方向,并重载函数

 public void onConfigurationChanged(Configuration newConfig)

这时需要两个权限的说明

2.1

<!-- 必須設定CHANGE CONFIGURATION權限 --><uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>

2.2

 <!-- 必須設定activity的configChanges屬性 --><activityandroid:name=".EX05_23"android:label="@string/app_name"android:configChanges="orientation|keyboard"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

实现的效果与第一个例子相同。

下面给出完整的实现代码:

public class EX05_23 extends Activity
{private TextView mTextView01;private Button mButton01;/* 屏幕宽高 */private int intScreenH,intScreenW;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);/* 声明Display对象,以取得屏幕宽高 */final Display defaultDisplay = getWindow().getWindowManager().getDefaultDisplay();intScreenH= defaultDisplay.getHeight();intScreenW = defaultDisplay.getWidth();mButton01 = (Button)findViewById(R.id.myButton1); mTextView01 = (TextView)findViewById(R.id.myTextView1);mTextView01.setText(Integer.toString(intScreenW)+"x"+Integer.toString(intScreenH));/* 当宽>高,表示为横式显示 */if(intScreenW > intScreenH){/* Landscape */mButton01.setText(R.string.str_button2);}else{/* Portrait */mButton01.setText(R.string.str_button1);}/* 按钮事件处理切换宽高 */mButton01.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v){// TODO Auto-generated method stubintScreenH= defaultDisplay.getHeight();intScreenW = defaultDisplay.getWidth();/* 如果为Landscape */if(intScreenW > intScreenH){/* Landscape => Portrait */setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);}else{/* Portrait => Landscape */setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}/* 再一次取得屏幕宽高 */intScreenH= defaultDisplay.getHeight();intScreenW = defaultDisplay.getWidth();mTextView01.setText(Integer.toString(intScreenW)+"x"+Integer.toString(intScreenH));}});}  @Overridepublic void onConfigurationChanged(Configuration newConfig){// TODO Auto-generated method stub/* 覆写onConfigurationChanged事件,捕捉当设定之后的值 */if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){/* 趁着事件发生之后,变更按钮上的文字 */mButton01.setText(R.string.str_button2);mMakeTextToast(getResources().getText(R.string.str_onConf_LANDSCAPE).toString(),false);}/* 须设定configChanges属性才能捕捉onConfigurationChanged */if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){mButton01.setText(R.string.str_button1);mMakeTextToast(getResources().getText(R.string.str_onConf_PORTRAIT).toString(),false);}if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO){}super.onConfigurationChanged(newConfig);}public void mMakeTextToast(String str, boolean isLong){if(isLong==true){Toast.makeText(EX05_23.this, str, Toast.LENGTH_LONG).show();}else{Toast.makeText(EX05_23.this, str, Toast.LENGTH_SHORT).show();}}
}

Android--屏幕方向的改变相关推荐

  1. Android屏幕方向调整的两种方式

    Android屏幕方向调整 作者:坚果 公众号:"大前端之旅" 华为云享专家,InfoQ签约作者,阿里云专家博主,51CTO博客首席体验官,开源项目GVA成员之一,专注于大前端技术 ...

  2. android 屏幕方向随传感器变化,并带有切换大屏,小屏和锁定屏幕方向

    直接上完整代码: import android.content.pm.ActivityInfo; import android.content.res.Configuration; import an ...

  3. Android 屏幕方向以及UI界面状态的保存

    屏幕方向以及UI界面状态的保存 首先,基于android studio,先将虚拟手机的屏幕自动翻转打开 1.设置屏幕锁定 在Androidmanifests.xml文件中,设置 android:scr ...

  4. android 屏幕方向监听,Android如何监听屏幕旋转

    背景 关于个人,前段时间由于业务太忙,所以一直没有来得及思考并且沉淀点东西:同时组内一个个都在业务上能有自己的思考和总结,在这样的氛围下,不由自主的驱使周末开始写点东西,希望自己除了日常忙于业务,可以 ...

  5. android 屏幕方向改变 重新测量,android – 扫描时自动更改屏幕方向(使用ZXING库)...

    我有MainActivity.kt,在那里我展示了不同需求的不同片段.在某些时候,我按下调用startScanner()函数的按钮'X': private fun startScanner() { I ...

  6. android 屏幕方向监听,android 屏幕旋转问题 - jwzhangjie的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    settings设置 在Android的Settings-> Display中有Orientation这一设置项.当选中时,屏幕会随设备旋转. settings设置是在文件SoundAndDis ...

  7. Android --- 屏幕方向screenOrientation属性详解

    landscape 限制界面为横屏,旋转屏幕也不会改变当前状态. portrait 限制界面为竖屏,旋转屏幕也不会改变当前状态 sensor 根据传感器定位方向,旋转手机90度,180,270,360 ...

  8. 2021年最详细的Android屏幕适配方案汇总

    1 Android屏幕适配的度量单位和相关概念 建议在阅读本文章之前,可以先阅读快乐李同学写的文章<Android屏幕适配的度量单位和相关概念>,这篇文章包含了阅读本文的一些基础知识,推荐 ...

  9. android手机分辨率适配,Android屏幕适配(一)

    为什么要屏幕适配 由于Android系统的开放性,任何用户.开发者.OEM厂商.运营商都可以对Android进行定制,于是导致运行 Android 的设备多种多样,它们有着不同的屏幕尺寸和像素密度. ...

  10. Flutter中获取监听屏幕方向、锁定屏幕方向

    文章目录 获取当前屏幕的方向 实时监听屏幕方向的改变 锁定屏幕方向 锁定方向,禁止App随着设备的方向改变 锁定启动图的方向 默认效果 Android配置 IOS配置 动态改变Flutter的屏幕方向 ...

最新文章

  1. 设置linux初始root密码
  2. 15.for循环的三个表达式是可以省略
  3. C++描述的位运算总结
  4. Exploring the Amazon Echo Dot, Part 2: Into MediaTek utility hell
  5. Visual Studio 跨平台開發實戰(5) - Xamarin Android 多頁面應用程式開發 (转帖)
  6. java限制金额控制_JavaMail 限额管理
  7. 中img拉伸_8个拉伸动作,帮你调动全身肌肉,提高柔韧性,缓解疲劳放松心情...
  8. 浙大 PAT 乙级1056
  9. 水烟炭行业调研报告 - 市场现状分析与发展前景预测
  10. 台式计算机 行业标准,GBT 9813.3-2017 计算机通用规范 第3部分:服务器国家标准...
  11. 基于Arduino的智能避障小车
  12. 蜗牛星际ABCD款,这几款的区别你知道吗?
  13. java创建表情包_表情包生成器
  14. Uncaught ReferenceError: is not defined
  15. qt小闹钟 完整程序_Qt实现闹钟小程序
  16. 【黄啊码】MySQL入门—4、掌握这些数据筛选技能比你学python还有用-1
  17. 传统数据库辉煌不再,云数据库迎来黄金时代
  18. 马桶的尺寸是多少 马桶尺寸是多大2022
  19. 三级分销如何做分销推广 如何设置分销比例
  20. 导数、偏导数以及梯度

热门文章

  1. vCenter Server Appliance 5.5忘记root密码
  2. PL/SQL不能导入备份文件如何解决
  3. 删除mysql的root用户恢复方法
  4. spring mvc中的@propertysource
  5. undefined reference to `libiconv_open 无法编译PHP
  6. com.android.providers.telephony.MmsSmsDatabaseHelper
  7. javascript十个最常用的自定义函数
  8. (原创)datagrid数据导出到excel文件给客户端下载的几种方法
  9. 12个不可不知的Sublime Text应用技巧和诀窍
  10. python 创建空文件的方法