1.Configuration类专门用来描述Android设备的配置信息。
5.在各个属性改变的时候,会重新跑Activity的生命周期函数,即Activity会重新启动。
主意:在configChanges属性中,需要加上screenSize,否则还是会重启Activity。
2.获得
Configuration类对象
Configuration config = getResources().getConfiguration();
3.各种属性介绍
(1)fontScale:字体的缩放因子
(2)keyboard:键盘类型
(3)
keyboardHidden:键盘是否可用,true为不可用,false为可用。当所有的键盘(软键盘&硬件键盘)都不可用才返回true。
(4)locale:语言(本地环境)。具体的要靠理解。setting中设置语言会导致local改变。
(5)mcc:国家码
(6)mnc:网络码
(7)navigation:导航类型
(8)orientation:屏幕方向
(9)touchscreen:触摸方式
4.使用实例获得各种属性
public class MainActivity extends Activity {
private TextView fontScaleTv = null;
private TextView keyboardTv = null;
private TextView keyboardHiddenTv = null;
private TextView localeTv = null;
private TextView mccTv = null;
private TextView mncTv = null;
private TextView navigationTv = null;
private TextView orientationTv = null;
private TextView touchscreenTv = null;
private Button changeOrientation = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("zmq", "MainActivty onCreate");
findView();
Configuration config = getResources().getConfiguration();
fontScaleTv.setText("字体缩放:" + config.fontScale);
keyboardTv.setText("键盘:" + config.keyboard);
keyboardHiddenTv.setText("键盘是否可用:" + config.keyboardHidden);
localeTv.setText("语言:" + config.locale);
mccTv.setText("国家码:" + config.mcc);
mncTv.setText("网络码:" + config.mnc);
navigationTv.setText("导航类型:" + config.navigation);
orientationTv.setText("屏幕方向:" + config.orientation);
touchscreenTv.setText("触摸方式:" + config.touchscreen);
}
private void findView() {
fontScaleTv = (TextView) findViewById(R.id.fontScaleTv);
keyboardTv = (TextView) findViewById(R.id.keyboardTv);
keyboardHiddenTv = (TextView) findViewById(R.id.keyboardHiddenTv);
localeTv = (TextView) findViewById(R.id.localeTv);
mccTv = (TextView) findViewById(R.id.mccTv);
mncTv = (TextView) findViewById(R.id.mncTv);
navigationTv = (TextView) findViewById(R.id.navigationTv);
orientationTv = (TextView) findViewById(R.id.orientationTv);
touchscreenTv = (TextView) findViewById(R.id.touchscreenTv);
changeOrientation = (Button) findViewById(R.id.changeOrientation);
changeOrientation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
// get Configuration info
Configuration config = getResources().getConfiguration();
Log.d("zmq", "orientation=" + config.orientation);
// current orientation is LANDSCAPE,then set to PORTRAIT
if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.d("zmq", "change LANDSCAPE to PORTRAIT");
MainActivity.this
.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
// current orientation is PORTRAIT,then set to LANDSCAPE
else if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
Log.d("zmq", "change PORTRAIT to LANDSCAPE");
MainActivity.this
.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
String orientation = newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? "横屏"
: "竖屏";
Toast.makeText(MainActivity.this, "orientation", Toast.LENGTH_SHORT).show();
}
}
<activity
android:name="com.zmq.configuration.MainActivity"
android:label="@string/app_name"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
当改变orientation的时候,会触发onConfigurationChanged函数运行(在Android中配置configChanges属性,如果没有配置这个属性,不会触发onConfigurationChanged函数运行)。(系统属性变化时,会触发此函数回调)
点击按钮:
会重新跑onCreate函数:
5.在各个属性改变的时候,会重新跑Activity的生命周期函数,即Activity会重新启动。
要想使Activity 不重新启动,则需要:
在Manifest文件中,使用android:configChanges属性,并且可以在Activity中重写onConfigurationChanged()方法。
例如,改变orientation:
<activity
android:name="com.zmq.configuration.MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
Log.d("zmq", "onConfigurationChanged");
String orientation = newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? "横屏"
: "竖屏";
Toast.makeText(MainActivity.this, "orientation:"+orientation, Toast.LENGTH_SHORT).show();
}
主意:在configChanges属性中,需要加上screenSize,否则还是会重启Activity。
locale的时候要加上layoutDirection。