首页 > 技术文章 > android屏幕旋转切换控件布局及数据的暂存

victorywr 2020-11-21 20:49 原文

首先如何实现竖屏和横屏下不同的控件布局

1、在activity_main.xml文件的布局窗口找到create landscape variation,就是创建另一个横屏的布局文件

 

 

 

 2、在工程目录看到多了一个activity_main.xml文件,在这里进行横屏情况下的控件布局

 

3、如下图所示为两种布局,按键分别是三行两列,两行三列分布

                  

 

 

 4、监听button1,按下按钮1后将上方的Textview显示由welcome变为button1,并重写ondestroy函数,调用destroy函数时打印相关信息

测试 屏幕旋转时 Textview显示的变化以及destroyed在何时会被调用

 

 

 

 从左至右依此是开始界面->按下button1后显示界面->旋转后界面    

测试发现每次旋转屏幕,都会调用一次destroy函数,说明旋转屏幕会导致程序的销毁,再重新开始一个新的程序,这也就意味着旋转后界面上的显示信息无法得到保存,所以图二到图三可以看到Textview的显示内容由button1变为了welcome就是这个原因。

 

5、如何保证在旋转屏幕后显示界面的信息依旧不改变?

 if(savedInstanceState!=null)        //需要先判断是否为空,不为空代表有历史数据保存需要进行数据复原,否则会引起空指针异常
        { 
            String s=savedInstanceState.getString("key");     //savedInstanceState存放的Bundle信息实际就是从outState而来
           textView.setText(s);
        }

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText(R.string.button1);
            }
        });
    }

    @Override   //不过这种方式保存数据只是临时保存,无法永久保存
    protected void onSaveInstanceState(@NonNull Bundle outState) {  //该函数用于提取出历史数据,保存到outState中
        super.onSaveInstanceState(outState);
        outState.putString("key",textView.getText().toString());//将textview中的内容存放在键值为KEY的字符串中,最终会存为一个Bundle
    }

调用onSaveInstanceState函数,可以暂时保存要保持的历史数据,在程序运行后判断savedInstanceState是否为空,对数据进行复原显示,不过这种方式只是暂时的保存了历史数据,不过应用到屏幕旋转中也能解决数据丢失的问题。

 

 

 

这样旋转屏幕后数据依旧不会改变。

 

推荐阅读