问题:
如图,“发现”页即为主页,然后我们切换到“我”页,一切正常。
那么问题来了,如果切换到“我”页后把手机横屏,则会出现下面的情况。
嗯?怎么又回到“发现”页了??
解决办法:
思考
据自己了解,Android应用程序刷新页面有两种情况,第一种是用户操作;
第二种非用户操作,即系统触发的。很明显这是系统触发的咯。
然后,搬来Android应用程序生命周期图:
看到,在整个生命周期中,APP会调用onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()、onDestroy()这几个函数。所以,我在MainActivity.java中重构这几个函数,使用LogCat来验证在横屏的过程中,APP就调用了哪些函数。
public class MainActivity extends AppCompatActivity {
private BottomNavigationView bottomNavigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//隐藏默认的顶部导航
getSupportActionBar().hide();
//获取底部导航视图实例
bottomNavigationView = findViewById(R.id.bottomNavi);
//把“发现”页作为主页
getSupportFragmentManager().beginTransaction().replace(R.id.contentFrame,new DiscoverFragment()).commit();
//注册底部导航按钮点击事件
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
FragmentTransaction transition = getSupportFragmentManager().beginTransaction();
switch (menuItem.getItemId()){
case R.id.bottomNavi_discover:
transition.replace(R.id.contentFrame,new DiscoverFragment()).commit();
break;
case R.id.bottomNavi_friends:
transition.replace(R.id.contentFrame,new FriendFragment()).commit();
break;
case R.id.bottomNavi_communicate:
transition.replace(R.id.contentFrame,new CommunicateFragment()).commit();
break;
case R.id.bottomNavi_myself:
transition.replace(R.id.contentFrame,new MeFragment()).commit();
break;
}
return true;
}
});
Log.i("MainActivity","onCreate()");
}
@Override
protected void onStart() {
super.onStart();
Log.i("MainActivity","onStart()");
}
@Override
protected void onResume() {
super.onResume();
Log.i("MainActivity","onResume()");
}
@Override
protected void onPause() {
super.onPause();
Log.i("MainActivity","onPause()");
}
@Override
protected void onStop() {
super.onStop();
Log.i("MainActivity","onStop()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("MainActivity","onDestroy()");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("MainActivity","onRestart()");
}
}
下面运行程序,横屏后,LogCat输出如下:
仔细观察发现,横屏后,程序再次调用了onCreate()函数,页面不刷新才怪勒!
解决
思路
在横屏前,先保存当前浏览的数据,然后在横屏后,恢复这个数据就可以了。
所以,添加一个信号量(全局变量),用来保存当前浏览的页面位置(1,2,3,4)
private int PageFlag = 1;
然后再加入如下代码,目的是在程序调用onDestroy()之前,通过onSaveInstanceState()函数保存当前的PageFlag值,在横屏后调用onRestoreInstanceState()时,恢复PageFlag的值,通过此方法恢复横屏前访问的页面。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("KEY_PAGE_INDEX",PageFlag);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState!=null){
PageFlag = savedInstanceState.getInt("KEY_PAGE_INDEX");
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
switch (PageFlag){
case 1:
transaction.replace(R.id.contentFrame,new DiscoverFragment()).commit();
PageFlag = 1;
break;
case 2:
transaction.replace(R.id.contentFrame,new FriendFragment()).commit();
PageFlag = 2;
break;
case 3:
transaction.replace(R.id.contentFrame,new CommunicateFragment()).commit();
PageFlag = 3;
break;
case 4:
transaction.replace(R.id.contentFrame,new MeFragment()).commit();
PageFlag = 4;
break;
}
}
}
再次横屏,
OK,问题解决!
注意
此APP仅用于学习,其中使用的是《小黑盒APP》中的资源
Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...
【转】android中重复连接ble设备导致的连接后直接返回STATE_DISCONNECTED的解决办法---不错不错,重新连接需要花费很长的时间
原文网址:http://bbs.eeworld.com.cn/thread-438571-1-1.html /* * 通过使用if(gatt==null ...
(转)Android中的页面切换动画
这段时间一直在忙Android的项目,总算抽出点时间休息一下,准备把一些项目用到的Android经验分享一下. 在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下 ...
Android中的“再按一次返回键退出程序”实现 (转) 按返回键退出程序时进行提醒