android:configChanges 屏幕横竖屏切换

本文介绍如何在Android应用中控制屏幕方向,包括固定屏幕方向及通过配置变化监听实现内容的适应性更新。

出处:http://blog.csdn.net/djy1992/article/details/9378195



---》


 android:screenOrientation="portrait"

当在AndroidManifest.xml文件中定义了android:screenOrientation="portrait",就表示当我们切换横竖屏的时候,屏幕的内容始终以竖屏显示,而不会根据屏幕的方向来显示内容

AndroidManifest.xml文件

 

复制代码
    
<? xml version="1.0" encoding="utf-8" ?>
< manifest xmlns:android ="http://schemas.android.com/apk/res/android"
package
="com.test"
android:versionCode
="1"
android:versionName
="1.0" >
< uses-sdk android:minSdkVersion ="8" />

< application android:icon ="@drawable/icon" android:label ="@string/app_name" >
< activity android:name =".TestActivity"
android:label
="@string/app_name"
android:screenOrientation
="portrait" >
< intent-filter >
< action android:name ="android.intent.action.MAIN" />
< category android:name ="android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >

</ application >
</ manifest >
复制代码

main.xml文件

复制代码
    
<? xml version="1.0" encoding="utf-8" ?>
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
< TextView
android:id ="@+id/tv"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="横竖屏切换测试"
/>
< EditText
android:layout_width ="fill_parent"
android:layout_height
="wrap_content"
android:id
="@+id/et"
/>
</ LinearLayout >
复制代码

TestActivity.java文件

复制代码
    
package com.test;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;

public class TestActivity extends Activity {
EditText et;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
et
= (EditText) findViewById(R.id.et);
tv
= (TextView) findViewById(R.id.tv);
System.out.println(
" 我是onCreate方法 " );
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super .onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
tv.setText(
" 横屏 " );
}
else {
tv.setText(
" 竖屏 " );
}

}
}
复制代码
 



----------------------------------------------------------------------------------



 

----》

   android:configChanges="keyboardHidden|orientation"


般在AndroidManifest.xml文件中都没有使用到android:configChanges="keyboardHidden|orientation"配置,当然还是很有用的哈

就是如果配置了这个属性,当我们横竖屏切换的时候会直接调用onCreate方法中的onConfigurationChanged方法,而不会重新执行onCreate方法,那当然如果不配置这个属性的话就会重新调用onCreate方法了,下面是测试

AndroidManifest.xml文件

复制代码
  
<? xml version="1.0" encoding="utf-8" ?>
< manifest xmlns:android ="http://schemas.android.com/apk/res/android"
package
="com.test"
android:versionCode
="1"
android:versionName
="1.0" >
< uses-sdk android:minSdkVersion ="8" />

< application android:icon ="@drawable/icon" android:label ="@string/app_name" >
< activity android:name =".TestActivity"
android:label
="@string/app_name"
android:configChanges
="keyboardHidden|orientation" >
< intent-filter >
< action android:name ="android.intent.action.MAIN" />
< category android:name ="android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >

</ application >
</ manifest >
复制代码

main.xml文件

复制代码
  
<? xml version="1.0" encoding="utf-8" ?>
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
< TextView
android:id ="@+id/tv"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="横竖屏切换测试"
/>
< EditText
android:layout_width ="fill_parent"
android:layout_height
="wrap_content"
android:id
="@+id/et"
/>
</ LinearLayout >
复制代码

TestActivity.java文件

复制代码
  
package com.test;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;

public class TestActivity extends Activity {
EditText et;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
et
= (EditText) findViewById(R.id.et);
tv
= (TextView) findViewById(R.id.tv);
System.out.println(
" 我是onCreate方法 " );
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super .onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
tv.setText(
"H 横屏 " );
}
else {
tv.setText(
"S 竖屏 " );
}

}
}
<think> 我们正在寻找如何为字体更改配置android:configChanges。根据引用,android:configChanges属性用于指定哪些配置更改将由Activity自己处理,而不是导致Activity重启。 在Android中,字体缩放属于“fontScale”配置更改。因此,我们需要在android:configChanges属性中包含"fontScale"。 根据引用[1]和[2]:当指定的配置发生更改时,系统不会重启Activity,而是调用Activity的onConfigurationChanged()方法。 因此,我们可以在manifest文件中为Activity设置: android:configChanges="fontScale" 另外,引用[3]提到,从Android 3.2(API 13)开始,屏幕尺寸相关的配置(如orientation)的行为有所变化,但这里我们只关心字体缩放,所以只需指定fontScale。 另外,引用[4]提醒我们,配置不当可能导致应用被回收重启,进而导致崩溃。因此,正确配置fontScale可以避免因字体缩放改变而导致的Activity重启。 具体步骤: 1.AndroidManifest.xml中对应的Activity标签内,添加android:configChanges属性,并包含"fontScale"。 2. 在Activity中重写onConfigurationChanged()方法,以处理字体缩放更改。 示例: 在AndroidManifest.xml中: <activity android:name=".MainActivity" android:configChanges="fontScale" ...> ... </activity> 在Activity代码中: @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.fontScale != getResources().getConfiguration().fontScale) { // 重新加载资源或调整UI以适应新的字体缩放比例 // 例如:重新设置某些视图的文本大小 } } 注意:如果同时需要处理其他配置更改(如屏幕方向、键盘可用性等),可以使用竖线(|)分隔多个值,例如: android:configChanges="fontScale|orientation|screenSize" 但是,根据需求,这里我们只关注字体缩放,所以只指定fontScale。 另外,需要注意的是,从Android 3.2(API 13)开始,屏幕方向变化需要同时指定"orientation|screenSize",因为设备在横竖屏切换时,屏幕尺寸也会发生变化。但对于字体缩放,只需要指定fontScale即可。 因此,回答用户的问题:在Android中,为处理字体缩放变化而不重启Activity,需要在android:configChanges中添加"fontScale",并重写Activity的onConfigurationChanged()方法。 生成相关问题: 根据上下文,我们可以生成以下相关问题: 1. 除了fontScale,android:configChanges还有哪些常用值? 2. 在onConfigurationChanged()方法中如何处理字体缩放变化? 3. 为什么在Android 3.2以后,配置屏幕方向变化需要同时指定orientation和screenSize? 4. 如何避免配置字体缩放后应用崩溃? 5. 在配置了android:configChanges="fontScale"后,如果没有重写onConfigurationChanged()方法会怎样? </think> ### 在 Android 中配置字体缩放的方法 在 Android 中使用 `android:configChanges` 处理字体缩放变化时,需通过以下步骤实现: #### 1. **配置清单文件(AndroidManifest.xml)** 在 Activity 标签中添加 `fontScale` 属性值: ```xml <activity android:name=".MainActivity" android:configChanges="fontScale|orientation|screenSize" /> ``` - **`fontScale`**:捕获字体缩放比例的变化(用户调整系统字体大小)。 - **`orientation|screenSize`**:同时处理屏幕方向/尺寸变化(通常需一起配置)[^1][^3]。 #### 2. **重写 `onConfigurationChanged()` 方法** 在对应的 Activity 中处理字体缩放逻辑: ```java @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 检测字体缩放变化 if (newConfig.fontScale != getResources().getConfiguration().fontScale) { // 重新加载界面或调整字体 recreate(); // 或自定义字体更新逻辑 } } ``` - 通过 `newConfig.fontScale` 获取新的字体缩放比例。 - 使用 `recreate()` 重启界面(推荐),或手动更新所有文本控件的字体大小[^1][^4]。 --- ### ⚠️ 注意事项 1. **避免遗漏配置** - 若未声明 `fontScale`,系统默认销毁并重建 Activity,导致临时数据丢失(如页面状态)[^4]。 - Android 3.2 (API 13) 后必须同时添加 `screenSize`(屏幕尺寸变化会触发重启)[^3]。 2. **防止空指针异常** - 若选择不重启 Activity(通过 `configChanges`),需在 `onConfigurationChanged()` 中**主动更新所有依赖字体的控件**,否则可能出现显示错误或崩溃[^4]。 3. **兼容性建议** - 优先使用 `recreate()` 简化逻辑,而非手动更新控件。 - 如需保留页面状态(如滚动位置),结合 `onSaveInstanceState()` 保存数据[^4]。 --- ### 示例场景 用户调整系统字体大小后: 1. 系统检测到 `fontScale` 变化,触发 `onConfigurationChanged()`。 2. 通过 `recreate()` 重启 Activity,重新加载布局资源(自动应用新字体)。 3. 页面字体更新,且无重启导致的空指针问题[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值