`
ipjmc
  • 浏览: 702383 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 处理横竖屏切换事件

阅读更多

    默认情况下,Activity在Configuration变化(比如设备横竖屏切换)时,会执行onDestory()周期函数,然后onCreate(),重新创建Activity。之所以这样是因为这样可以让Activity动态适应Configuration,比如横屏时使用横屏的layout,drawable等resources,竖屏时使用竖屏的layout,drawable等resources。重启Activity可能导致大量数据的重新获取,网络连接的重新建立等问题,用户体验非常差。Android Dev guide给出两种解决方案
1)在Configuration变化时,保持数据不变
2)你自己处理,而不是重启Activity

    下面分别详细介绍一下这两种方法
1)在Configuration变化时,保持数据不变。需要注意的是我们不应该保存那些依赖Activity的数据,比如Drawable,Adapter,View或者任何与Context相关联的数据。因为上一个Activity已经没有了,如果你还要保持这些资源的引用,可能导致资源泄露。使用方法如下:

    重写Activity.onRetainNonConfigurationInstance(),保存数据

@Override
public Object onRetainNonConfigurationInstance() {
    final MyDataObject data = collectMyLoadedData();
    return data;
}


    在onCreate()中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
    if (data == null) {
        data = loadMyData();
    }
    ...
}


2)你自己处理,而不是重启Activity。这种方法相对简单一些,缺点是动态适应差。比如横竖屏切换时需要你自己写代码来使用不同的layout等resource,语言设置的动态改变等,不推荐。使用方法如下:
    在AndroidManifiest.xml中为当前的Activity设置android:configChanges


<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">


    重写Activity.onConfigurationChanged(),做一些相应的动作,如果没有则可以不用重写


@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}


    详情请参考:http://developer.android.com/guide/topics/resources/runtime-changes.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics