如果设备的配置(在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. */
@Override
public 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()
{
@Override
public 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);
//}
}
});
}
@Override
public 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);
}
@Override
public 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屬性 -->
<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>
实现的效果与第一个例子相同。
下面给出完整的实现代码:
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();
}
}
}
分享到:
相关推荐
`DrawerLayout`是官方提供的组件,用于在主屏幕侧边创建一个可滑出的抽屉,而`SlidingPaneLayout`则允许在水平方向上滑动两个视图。 2. 上下抽屉:在Android中,上下抽屉效果相对较少见,但可以通过自定义布局和...
考虑到Android设备的多样性,PullLayout需要处理不同的屏幕尺寸、分辨率和设备方向。在设计时,开发者需要确保布局在横屏和竖屏模式下都能正常工作,同时保持良好的可读性和触摸反馈。 五、集成与使用 在实际项目...
Android 屏幕旋转实例,改变屏幕方向,这个和平时的锁定屏幕方向有关联,其基本的实现思路如下: public void onConfigurationChanged(Configuration newConfig) { Toast.makeText(this, "系统的屏幕方向发生...
在Android开发中,屏幕方向是一个重要的考虑因素,因为它直接影响到用户体验和应用的视觉效果。本文将深入探讨Android系统中如何管理和控制屏幕方向。 首先,屏幕方向的设置主要针对`Activity`,开发者通常会在`...
2. LayoutManager:布局管理器负责决定视图如何在屏幕上布局,如线性布局(LinearLayoutManager)、网格布局(GridLayoutManager)和瀑布流布局(StaggeredGridLayoutManager)。 3. Adapter:适配器是数据和视图...
- 图片处理:包括裁剪、缩放、旋转等操作,使得图片可以更好地适应不同的屏幕尺寸和方向。 2. **ViewUtils**: - 动画与过渡效果:提供了多种视图动画,如淡入淡出、平移、旋转等,为界面增添动态美感。 - 视图...
7. **适配不同的屏幕尺寸和方向**:确保导航抽屉在不同设备和屏幕方向下都能正常工作。 导航抽屉是Android Material Design规范的一部分,遵循这一规范可以使应用具有统一且直观的用户体验。在实际项目中,开发者...
然而,Android-Hauler库引入了一种新的交互方式,允许用户通过在屏幕边缘滑动来关闭当前的Activity。这一特性常见于许多现代应用,如Google的Material Design指南所提倡的设计模式。 使用Android-Hauler库,开发者...
4. **处理配置变更**:当屏幕方向改变时,Android可能会销毁并重建活动。为了防止数据丢失,可以重写`onSaveInstanceState()`来保存状态,并在`onCreate()`或`onRestoreInstanceState()`中恢复。 5. **权限检查**:...
`OrientationEventListener`是一个轻量级的API,用于监听设备的屏幕方向改变。它可以监听到设备的三个基本方向:正向(portrait)、横向(landscape)以及反向横向(reverse landscape)。在用户改变设备方向时,会...
本篇文章将深入探讨如何控制Android Activity的屏幕方向,实现始终横屏、全屏显示以及如何处理屏幕方向改变时Activity的销毁与重建问题。 1. **屏幕始终横屏或竖屏** 在AndroidManifest.xml中,我们可以为特定的...
5. **适应性**:兼容不同尺寸和方向的屏幕,保证在各种设备上都能良好显示。 6. **可扩展性**:方便添加额外的功能,如步骤描述、错误提示等。 在实际项目中,StepView可能应用于购物车结账流程、设置向导、任务...
9. **适配不同屏幕尺寸**: 考虑到Android设备的多样性,确保字母索引列表在不同分辨率和屏幕方向下都能正常工作。 10. **可访问性**: 确保功能对视力障碍的用户友好,可能需要提供语音反馈或者其他辅助功能。 总的...
它是一个定制化的控件,名为AutoScrollTextView,能够实现文字在屏幕上的自动滚动效果,而且滚动方向非常灵活,包括上、下、左、右四个方向,从而增加了用户界面的动态性和多样性。 AutoScrollTextView是基于...
3. **State Management**:SlidingLayer维护了自身的状态(打开、关闭、半开等),并提供了相应的回调方法,以便在状态改变时通知开发者。 集成与自定义: 1. **添加依赖**:首先,开发者需要将库的aar文件添加到...
我们需要在这个方法中计算手指的起始和结束位置,判断滑动方向是否是从屏幕左侧向右侧,并根据滑动距离和速度来决定是否触发退出Activity的操作。 接下来,我们要考虑视图层级管理。在Android中,布局通常由多个...
例如,使用`android:background`属性可以改变边框样式,`android:textColorHint`可设定提示文本颜色。 2. **输入验证**: 对于用户输入的验证,开发者可以监听`TextWatcher`事件,实时检查用户输入是否符合预期。...
通过指定`orientation`,当屏幕方向改变时,系统会调用`onConfigurationChanged`而不是销毁并重建活动。 总的来说,这个压缩包提供的资源可以帮助开发者学习如何在Android应用中实现屏幕方向锁定功能,避免不必要的...
Android屏幕分为多个类别:LDPI(低密度),MDPI(中密度),HDPI(高密度),XHDPI(超高清密度)等。每个类别对应不同的像素密度,例如MDPI为160dpi,HDPI为240dpi。屏幕分辨率则表示水平和垂直方向上的像素数量...
客户需要根据自己的产品设计及应用环境,切换屏幕的显示方向,或者固定好一个显示方向,例如产品中使用不同分辨率的显示屏,或者显示屏在产品中的固定方向发生改变等等,都需要进行屏幕旋转功能。 那么如何设置屏幕的...