一步步来做GeoQuiz之横竖屏转换

2016.8.4主要是Activity生命周期的问题,解决在横竖屏转换时出现当前问题被重置的BUG,学会LOG过滤器的设置

主要的原因是由于在应用的运行中,当当前的设备配置发生改变时,Android会销毁当前的activity,然后再重新创建;在横竖屏转换时,也就是配置发生了改变,所以系统销毁了activity,然后再重新创建,这样问题又回到了第一个。下图中是设置横竖屏转换后的LOG输出,可以看到当转换时,先调用onPause(),之后调用onsaveInstanceState()来保存,接下来就onStop()->onDestroy(),然后再onCreate()-> onStart()->onResume()

一步步来做GeoQuiz之横竖屏转换_第1张图片
ss_third_chapter_logfilter.png

1

横屏的设置

一步步来做GeoQuiz之横竖屏转换_第2张图片
ss_third_chapter_land.png

先需要在res文件下创建一个Android resources directory文件夹,layout, orintation选择之后选择landscape,生成一个layout-land文件夹存放所以横屏时的layout资源文件,由系统自动调用。注意保证资源文件的名字一定要跟layout文件里的名字一样

横屏中采用了Framelayout,代码是这样,位置不是很好控制,以后再学学



    ...
    
    

2

LOG

LogLevel Method 说明
Error Log.e(...) 错误信息
WARNNING Log.w(...) 警告信息
INFO Log.i(...) 信息型消息
DEBUG Log.d(...) 调试输出:可能被过滤掉
VERBOSE Log.v(...) 只用于开发

验证生命周期的Log是这样的:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"---------onCreate(Bundle) 调用了");
        setContentView(R.layout.activity_main);
    
    ...


    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"---------onStart() 调用了");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG,"---------onPause() 调用了");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"---------onResume() 调用了");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"---------onStop() 调用了");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"---------onDestroy() 调用了");
    }

上面的LOG信息,除了onCreate()中的必须在super之后之外,其他5个无所谓是不是在超类的前后

一步步来做GeoQuiz之横竖屏转换_第3张图片
ss_third_chapter_loginfo.png

3

怎么实现在横竖屏转换时保持当前的题不变呢?

由于之前说过,横竖屏转换时会被销毁activity之后重建,所以需要保存当前的数据,在再创建的时候调用,来保证横竖屏转换后内容不变。这里用到了onSaveInstanceState()方法。

就是重写onSaveInstanceState()方法,保存一个Bundle数据,在重建使得onCreate(Bundle)方法中取出这个Bundle,在updateQuestion()之前,先判断是不是获取了之前的Bundle,否则就显示mCurrentInex的初始值0.

代码

首先创建一个全局常量

private static final String KEY_INDEX = "index";

然后在onSaveInstanceState(Bundle)中,把当前的mCurrent值赋予KEY_INDEX, avedIstanceState.putInt(KEY_INDEX,mCurrentIndex);


   //保存InstanceState到Bundle
    @Override
    protected void onSaveInstanceState(Bundle savedIstanceState) {
        super.onSaveInstanceState(savedIstanceState);
        Log.i(TAG,"onSaveInstanceState被调用了");
        savedIstanceState.putInt(KEY_INDEX,mCurrentIndex);
    }

之后在onCreate()方法中调用
并把KEY_INDEX的数据传给mCurrent,这样就完成了保存Bundle用于创建新的Activity


        //调用之前的Bundle数据,先检查是不是获取成功
        if (savedInstanceState != null){
            mCurrentIndex = savedInstanceState.getInt(KEY_INDEX,0);
        }

        //调用updateQuestion()显示初始的问题内容
        updateQuestion();


你可能感兴趣的:(一步步来做GeoQuiz之横竖屏转换)