`

【转】绝对有用,Android系统更改事件之横竖屏切换

阅读更多

原文地址,转载请注明,谢谢合作!

http://www.eoeandroid.com/thread-74654-1-1.html

                 onConfigurationChanged信息处理

       在前面的范例中,我们看到了屏幕方向的更改,事实上,当屏幕方向改变时,就会发生onConfigurationChanged事件。虽然可以在更改方向时,显示要更改的方向,但是并无法取得更改后的宽高或更改后的结果,此时,就必须通过onConfigurationChanged的信息事件进行处理。

       以下的范例为重写Activity里的onConfigurationChanged信息事件,并捕捉屏幕画面方向改变后的事件,在当下更改按钮上的文字,与将屏幕的分辨率显示在TextView上,如此一来,便能完全掌握更改屏幕之后的按钮文字,以及正确捕捉切换画面后的屏幕分辨率,这样即可适用于Layout的重新部署,或者搭配手机旋转事件应用。

       onConfigurationChanged()方法,是当系统发生系统设置改变之后所触发的事件,其中唯一的传入参数为Configuration对象,除了可捕捉屏幕设置更改事件之外,也可捕捉其他系统设置更改的事件,如隐藏键盘或打开键盘等。

 

 



 

 

按钮事件毕竟是调用更改屏幕的起点,假如将访问屏幕分辨率的语句编写在按钮事件当中,就无法确认正确的屏幕方向,据此更改按钮文字。以下的方法是通过重写onConfigurationChanged()事件,在系统设置改变的当下,在onConfigurationChanged()里,依据更改结果显示按钮文字。如当画面变成了Configuration.ORIENTATION_LANDSCAPE,则将按钮显示文字改为"按我旋转为PORTRAIT";如果发生了Configuration.ORIENTATION_PORTRAIT,则将按钮显示文字改为"按我旋转为LANDSCAPE"。

import android.content.pm.ActivityInfo;
import android.content.res.Configuration;

public class EX05_23 extends Activity {
private TextView mTextView01;
private Button mButton01;
/* 屏幕宽高 */
private int intScreenH,intScreenW;
/** Called when the activity is first created. */
@Override
public 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() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
intScreenH= 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) );
}
});
}

@Override
public 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();
}

}

}

 

 AndroidManifest.xml

        必须要在Activity里设置configChanges属性,以作为系统设置更改时要捕捉的事件;除此之外,还需要取得系统设置更改的权限(android.permission.CHANGE_CONFIGURATION)。

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="irdc.ex05_23"
android:versionCode="1"
android:versionName="1.0.0">
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<!-- 必须设置activity的configChanges属性 -->
<activity
android: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>
</application>
<!-- 必须设置CHANGE CONFIGURATION权限 -->
<uses-permission
android:name="android.permission.CHANGE_CONFIGURATION"/>
<uses-sdk android:minSdkVersion="7" />
</manifest>

 

 onConfigurationChanged的参数如下:
 public void onConfigurationChanged(Configuration newConfig) 其中唯一的参数newConfig,是手机更改的新设置,类型为Configuration

效果图


 

  • 大小: 17.5 KB
  • 大小: 10.2 KB
分享到:
评论

相关推荐

    Android应用源码之(横竖屏切换处理-IT计算机-毕业设计.zip

    这份"Android应用源码之(横竖屏切换处理)"的资源,是一个非常适合毕业设计学习的示例,可以帮助开发者深入理解如何在Android应用中处理屏幕旋转的问题。 首先,Android系统默认支持横竖屏的自动切换,但有时为了...

    Android视频播放器(支持横竖屏切换)

    在Android平台上开发一款支持横竖屏切换的视频播放器是一项常见的任务,这涉及到对Android多媒体框架的深入理解和屏幕适配策略。"Android视频播放器(支持横竖屏切换)"这个项目的核心目标是创建一个能够根据设备...

    Android 横竖屏切换

    在没有关闭横竖屏切换功能的情况下,当系统触发屏幕方向改变时,当前活动的App界面也会随之旋转。但有时这种旋转可能会导致界面布局和尺寸等参数发生变化,从而引发不必要的麻烦,因此开发者通常需要在App内部禁止...

    【Android每周专题】横竖屏切换

    本文将深入探讨Android系统中的横竖屏切换机制,并通过"OrientationSwitchDemo"这个示例代码来帮助理解。 Android系统允许应用在设备旋转时自动调整布局,这得益于Android的资源配置和Activity生命周期管理。当设备...

    android动态创建fragment,横竖屏切换.

    这样,当横竖屏切换时,系统不会销毁Activity,而是调用这个方法。 - 使用`setRetainInstance(true)`方法来保留Fragment实例。在Fragment的生命周期中,当Activity重建时,只有Fragment的状态会保留,但请注意,这...

    Android应用源码之(横竖屏切换处理).zip

    本资源“Android应用源码之(横竖屏切换处理).zip”提供了相关的源码示例,旨在帮助开发者理解和掌握如何处理横竖屏切换时的问题。 在Android系统中,横竖屏切换默认会导致Activity重建,这可能导致UI布局的改变和...

    android 视频播放 点击横竖屏切换 自动旋转横竖屏切换 冲突

    android 视频播放 点击横竖屏切换 自动旋转横竖屏切换 冲突 仿优酷(ios)效果 android没去看看到ios有这个效果 项目需要也实现了

    Fragment的使用,隐藏显示以及androidPad横竖屏切换

    本示例“Fragment的使用,隐藏显示以及androidPad横竖屏切换”将重点讲解如何操作Fragment以及处理平板设备上的横竖屏切换。 首先,让我们深入理解Fragment的生命周期。Fragment有自己的onCreate(), onCreateView()...

    android 二维码扫描 支持横竖屏切换Demo

    本Demo主要展示了如何利用zxing库实现一个支持横竖屏切换的二维码扫描功能。ZXing,全称Zebra Crossing,是一个开源的条码处理库,支持多种格式的条码和二维码扫描。 首先,我们需要在项目中集成zxing库。这里使用...

    android安卓横竖屏切换效果、webview加载以及生命周期监测

    在Android系统中,设备屏幕方向的改变会导致Activity被销毁并重新创建,这是因为默认情况下,Android将横竖屏切换视为配置更改。开发者可以通过在AndroidManifest.xml中对特定Activity设置`android:configChanges=...

    安卓Android源码——(横竖屏切换处理).rar

    在安卓(Android)系统中,横竖屏切换是应用程序开发中的常见需求,涉及到用户界面(UI)布局的动态调整和程序状态的保存与恢复。本资料"安卓Android源码——(横竖屏切换处理).rar"很可能是针对这一主题的一个实践...

    Android中WebView播放网上视频,横竖屏切换

    当涉及到横竖屏切换时,Android系统会默认销毁并重新创建当前Activity,这可能导致WebView的视频播放状态丢失。为解决这个问题,我们可以采用以下策略: 1. **配置Activity**:在AndroidManifest.xml中,将Activity...

    android 2.2 中横竖屏切换管理方案

    在Android 2.2系统中,横竖屏切换的管理主要涉及到设备的传感器技术,特别是重力感应器,以及系统如何根据这些传感器的数据调整屏幕布局。这个过程的关键在于理解布局方式、角度阈值和旋转映射关系。 首先,我们要...

    android横竖屏切换

    在Android开发中,横竖屏切换是一个常见的需求,它涉及到屏幕方向变化时应用程序的处理方式。本Demo旨在演示如何在Android应用中实现横竖屏的切换,并妥善处理屏幕旋转带来的影响。下面将详细介绍这个主题。 1. **...

    Android横竖屏切换处理Demo源码.rar

    在Android开发中,横竖屏切换是常见的场景,它涉及到应用程序界面布局的适应性和用户体验。这份"Android横竖屏切换处理Demo源码"提供了一个很好的学习示例,帮助开发者理解和处理这一问题。以下是对这个Demo源码中...

    fragment横竖屏切换demo

    Fragment的概念在Android 3.0(API级别11)引入,为开发者提供了更大的灵活性来设计多屏幕应用,特别是在处理横竖屏切换时。本项目"fragment横竖屏切换demo"是一个实际操作的例子,展示了如何利用Fragment来实现横竖...

    Android之横竖屏切换

    Android 横竖屏切换是手机开发中一个非常常见的问题,很多软件在开发过程中为了避免横竖屏切换时引发不必要的麻烦,通常禁止掉横竖屏的切换,即通过在 AndroidManifest.xml 中设置 activity 中的 android:...

    安卓 横竖屏切换源程序

    在Android开发中,横竖屏切换是一个常见的需求,尤其对于那些需要优化用户界面展示的应用来说。这个"安卓横竖屏切换源程序"提供了一个可复用的解决方案,可以帮助开发者轻松地将横竖屏切换功能集成到自己的应用中。...

    Android应用源码之(横竖屏切换处理.zip

    这份名为"Android应用源码之(横竖屏切换处理.zip"的压缩包提供了相关的源代码示例,帮助开发者更好地理解和处理这一问题。源码的分析将涵盖以下几个关键知识点: 1. **屏幕方向检测**: - 在Android中,我们可以...

Global site tag (gtag.js) - Google Analytics