Android 横竖屏切换加载不同的布局
来源:互联网 发布:删除root软件 编辑:程序博客网 时间:2024/05/18 00:00
横屏竖屏在配置文件中的设置,之前已经说过。那么现在主要是说,切换之后由于屏幕宽高尺寸的改变,因此需要重新设置一个布局文件以适应现在的新的尺寸。
缺省状态下,Activity每次横竖屏切换(包括用setRequestedOrientation调用)都会重新调用一轮onPause-> onStop-> onDestory-> onCreate->onStart->onResume操作,从而销毁原来的Activity对象,创建新的Activity对象,这是因为通常情况下软件在横竖屏之间切换,界面的高宽会发生转换,从而可能会要求不同的布局。具体的布局切换可以通过如下两种方法来实现:
1.直接新建两个布局文件,剩下的就什么也不用管了:右键单击‘res’文件夹 -> 'new' -> 'Android resource directory'; 将 Directory name 填写 layout-land,Resource type 选择layout,这是建立了一个横屏的布局文件,同样的方式再建立一个layout-port资源文件夹,里面放一个竖屏的布局文件,名字要起一样的,这个很重要,然后再java文件中设置setvontentview就行 了。这样屏幕切换的时候他们会被自动加载
2.假如布局资源是不一样又不按照如上设置,则需要通过java代码来判断当前是横屏还是竖屏然后来加载相应的xml布局文件(比如mainP为竖屏mainL为横屏)。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的onCreate方法,你可以把以下方法放在你的onCreate中来检查当前的方向,然后可以让你的setContentView来载入不同的layout xml。
首先在layout下,建立两个布局文件,一个是横屏的一个是竖屏的,然后再java文件中布置这两个文件就行了。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int orientation = getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { setContentView(R.layout.land); } else if (orientation == Configuration.ORIENTATION_PORTRAIT) { setContentView(R.layout.port); } //接下来,就可以做一些初始化等操作了 }上面这两种方式实现对于横竖屏的切换加载不同的布局文件,都会让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(); } ... }
到这个地方,可能有人还会问,我就是同一个activity为什么切换个横竖屏一定要重新加载,我不想重新加载有没有办法呢,有的,需要拦截,具体如下:
首先需要配置文件中做点属性的配置
Andorid 3.2以前的SDK可以使用如下配置android:configChanges="orientation|keyboardHidden"而Adnroid 3.2以后的SDK必须添加一个screenSize属性,具体如下android:configChanges="keyboardHidden|orientation|screenSize"或者android:configChanges="orientation|screenSize"
然后重写activity中onConfigurationChanged 方法,这里也分为三种情况:
//1.布局分别在layout-land和layout-port目录中的同名main.xml时,就是上面说的第一种情况@Overridepublic void onConfigurationChanged (Configuration newConfig){ super.onConfigurationChanged(newConfig); setContentView(R.layout.main); //注意,这里删除了init(),否则又初始化了,状态就丢失 findViews(); setListensers();}//布局为不按照layout-land和layout-port目录,而自定义名字时@Overridepublic void onConfigurationChanged (Configuration newConfig){ super.onConfigurationChanged(newConfig); int mCurrentOrientation = getResources().getConfiguration().orientation; if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) { // If current screen is portrait setContentView(R.layout.mainP); //注意,这里删除了init(),否则又初始化了,状态就丢失 findViews(); setListensers(); } else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) { //If current screen is landscape setContentView(R.layout.mainL); //注意,这里删除了init(),否则又初始化了,状态就丢失 findViews(); setListensers(); }}当然有时候连布局都不用更改的话,就可以直接对原有控件进行调用操作了,比如:public class MainActivity extends Activity { private TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i("--Main--", "onCreate"); textView=(TextView)findViewById(R.id.tv_id); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i("--Main--", "onConfigurationChanged"); if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){ textView.setText("当前屏幕为横屏"); }else{ textView.setText("当前屏幕为竖屏"); } } }
- Android 横竖屏切换加载不同的布局
- Fragment 横竖屏切换时加载不同的布局
- Android中横竖屏切换加载不同布局导致fragment数据丢失的问题
- Android横竖屏切换及其对应布局加载问题
- Android横竖屏切换及其对应布局加载问题
- Android之屏幕方向|显示方式|Activity重建问题|横竖屏切换不同的布局
- android 动态设置横竖屏切换 控制dialog等布局文件加载的方法
- Android横竖屏切换布局不正常的问题
- Android横竖屏切换布局不正常的问题
- android横竖屏切换和布局的问题
- android横竖屏切换和布局的问题
- android ActivityGroup横竖屏使用不同布局导致的问题
- android LayoutInflater 横竖屏不同布局的处理
- Android布局之横竖屏切换
- Android布局之横竖屏切换
- Android布局之横竖屏切换
- Android布局之横竖屏切换
- Android横竖屏切换改变布局
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFa
- TensorFlow初入门
- 算法编程题4-单词逆序问题
- cs231n神经网络笔记
- Python中使用GoogleMaps API(包含Geocoding API,Places API Web Service )详细教程
- Android 横竖屏切换加载不同的布局
- PL/SQL语言--游标
- 网络应用编程接口
- 在JDBC操作中关于java.util.Date跟java.sql.Date之间的转换问题
- php比较多维数组中值的大小排序实现代码
- php 中define()和const几大区别
- Android studio技巧
- 使用Emojione Area在Firefox下光标异常的解决方法
- 基于jdk1.8的简单性能监控分析