安卓横竖屏切换的几种情况

作者: Reinelili | 来源:发表于2019-04-07 00:35 被阅读13次

    横竖屏切换在APP中的应用非常常见。有的界面只能在横屏或竖屏显示,有的界面可以横竖屏自适应,有的横竖屏使用不同的界面布局。我们来逐渐总结和比较一下这几种方式。

    1. 最简单的一种:横竖屏自适应

    就是,同一种布局,但是在横竖屏切换时自动调整长宽。不必新写布局。操作简单。不过有的时候可能无法满足美观和使用需要。但是,这种方法会保存界面数据,不会重刷一次该Activty的生命周期。

    用法非常简单,直接在AndroidManifest.xml文件中的指定Activity中添加:

    <activity android:name=".AugmentedImageActivity"
        android:configChanges="orientation|screenSize|keyboardHidden"/>
    

    有时重写onConfigurationChanged()方法,我这个项目里不太需要。大家可以自行根据自己的项目判断是否需要重写。(下面引用收集到的代码:)

    
    //1.布局分别在layout-land和layout-port目录中的同名main.xml时,就是上面说的第一种情况
    @Override
    public void onConfigurationChanged (Configuration newConfig){
     
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.main);
     
        //注意,这里删除了init(),否则又初始化了,状态就丢失
        findViews();
        setListensers();
     
    }
     
    //布局为不按照layout-land和layout-port目录,而自定义名字时
    @Override
    public 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("当前屏幕为竖屏");
            }
        }   
    }
    

    注意不同版本:


    image.png

    2. 横竖屏使用不同layout界面布局(同名layout自动加载)

    在Res/layout文件夹中新建一个文件夹,里面创建两个layout布局文件,使用相同的命名:


    image.png

    这样,在使用时,不必再手动判断屏幕方向,而是由应用自己判断,如果是横屏则自动加载land布局,如果是竖屏则自动加载port布局。

    3. 横竖屏使用不同layout界面布局(非同名的两个layout文件)

    如果想要手动指定横屏之后使用哪个界面布局,可以在Activity中的onCreate()方法中进行判断。这种方法,每次均会重启该Activity,每次都会重新判断。

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            int orientation = getResources().getConfiguration().orientation;
            if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                setContentView(R.layout.activity_main_land);
                //your action
    
            } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                setContentView(R.layout.activity_main);
                //your action
            }
    

    参考:https://blog.csdn.net/u010365819/article/details/76618443

    相关文章

      网友评论

        本文标题:安卓横竖屏切换的几种情况

        本文链接:https://www.haomeiwen.com/subject/wrcjiqtx.html