在前一个例子中我们看到了屏幕方向的更改,事实上,当屏幕方向改变是,就会发生onConfigurationChanged()事件;虽然可以在更改方向是显示要更改的方向,但是并无法取得更改后的宽高或更改后的结果,此时,就必须通过onConfigurationChanged()的心事事件进行处理。
onConfigurationChanged()方法是当系统发生系统设置改变之后所触发的事件,其中唯一的传入参数为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();
}
}
}
必须要在Activity里设置configChanges属性,以作为系统设置更改时要扑捉的事件,除此之外,还需要获得系统设置更改的权限(<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>)
<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>
<uses-sdk android:minSdkVersion="8" />
<!-- 必須設定CHANGE CONFIGURATION權限 -->
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
分享到:
相关推荐
- **忽略配置变更**:在AndroidManifest.xml中针对特定Activity设置`android:configChanges="orientation|screenSize"`,不让系统自动处理,然后在Activity中重写`onConfigurationChanged(Configuration newConfig)...
当这些配置更改发生时,系统会调用Activity的onConfigurationChanged()方法。 3. Activity间的状态保存:在文档中,提到了Activity的生命周期中的状态保存。在Activity可能被系统销毁时,比如配置更改或者系统资源...
这样,系统在屏幕旋转时不会默认销毁Activity,而是调用`onConfigurationChanged(Configuration newConfig)`方法。但这种方法并不推荐,因为它会使Activity负责处理屏幕旋转的逻辑,而使用ViewModel的方式更符合...
- **Android是否属于RTOS**:尽管Android具有一定的实时性,但它不是严格意义上的实时操作系统,因为它主要面向的是移动设备的应用环境,而不是要求严格时间响应的工业控制等领域。 综上所述,理解上述知识点对于...
此外,考虑到Android系统可能需要一段时间才能完全更新语言设置,我们可能需要监听`onConfigurationChanged()`回调,以便在语言切换后及时刷新界面。 总之,实现"Android中英俄切换"涉及了Android的资源管理、配置...
3. **性能考虑**:频繁地调用`onCreate()`确实会增加应用的启动时间,尤其是在资源密集型的操作中。通过适当的方式避免不必要的重启可以提高应用的整体性能。 4. **测试**:在实际部署之前,务必在多种设备和屏幕...
开发者可以通过重写Activity的onConfigurationChanged方法来处理配置更改事件,或者注册BroadcastReceiver来监听系统广播,如网络连接状态的改变。 4. **Handler消息传递机制**:Handler是Android中用于线程间通信...
服务是安卓系统中一个在后台运行的组件,它可以长时间执行任务而不显示用户界面。在这个项目中,服务可能用于维持浮动小插件的存在状态,即使用户切换到其他应用,小插件依然能在屏幕上方显示。 窗口管理器则允许...
- onConfigurationChanged():配置更改时(如屏幕方向变化)调用,除非在AndroidManifest.xml中声明对应的配置变化。 在处理屏幕旋转时,Android会默认重新创建Activity以适应新的配置。通过设置`android:...
这通常涉及到修改`Configuration`对象的`locale`属性,并调用`Resources.updateConfiguration()`方法。以下是一个简单的示例: ```java public void changeLanguage(String languageCode) { Locale locale = new...
5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 6.1 您有一条短信popup提醒...
5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 6.1 您有一条短信popup提醒...
5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 6.1 您有一条短信popup提醒...
5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 6.1 您有一条短信popup提醒...
IOS13推出到现在已经大半年了,系统应用没得说,完美适配,三方应用也都陆续支持了暗黑模式,就连微信在前段时间的更新中也实现了暗黑模式,先来欣赏下微信的暗黑模式吧! 当Activity声明它处理配置更改时,...
- **2.1** 当设备配置(如横竖屏切换)发生变化时,重写`onConfigurationChanged()`方法,调用`notifyDataSetChanged()`通知Gallery的Adapter数据已更新。 - **2.2** 在Gallery的`onItemSelected()`回调中,同样...
这样,当屏幕旋转时,系统不会销毁并重新创建Activity,而是调用`onConfigurationChanged(Configuration newConfig)`方法。在这里,你需要手动处理配置变更,如更新UI布局以适应新的屏幕方向。 此外,还有一些最佳...
5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 –p254 6.1 您有一条短信popup...
5.21 任务管理器正在运行的程序——RunningTaskInfo 5.22 动态更改屏幕方向——LANDSCAPE与PORTRAIT 5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——...