问题:

如图,“发现”页即为主页,然后我们切换到“我”页,一切正常。



那么问题来了,如果切换到“我”页后把手机横屏,则会出现下面的情况。

嗯?怎么又回到“发现”页了??

解决办法:

思考

据自己了解,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中使用BottomNavigationView切换横屏导致返回主页的问题的更多相关文章

  1. Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程

    最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...

  2. 【转】android中重复连接ble设备导致的连接后直接返回STATE_DISCONNECTED的解决办法---不错不错,重新连接需要花费很长的时间

    原文网址:http://bbs.eeworld.com.cn/thread-438571-1-1.html /*                         * 通过使用if(gatt==null ...

  3. (转)Android中的页面切换动画

    这段时间一直在忙Android的项目,总算抽出点时间休息一下,准备把一些项目用到的Android经验分享一下. 在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下 ...

  4. Android中的“再按一次返回键退出程序”实现 (转) 按返回键退出程序时进行提醒

    原文地址: https://blog.csdn.net/xichenguan/article/details/47030303 最近在研究   Android  编程方面的东西, 有了以下发现,  该 ...

  5. Android中调用另一个Activity并返回结果-以模拟选择头像功能为例

    场景 Android中点击按钮启动另一个Activity以及Activity之间传值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  6. Android中的“再按一次返回键退出程序”实现

    用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友好,用户还得移动手指去按dial ...

  7. Android中的“再按一次返回键退出程序”实现[转]

    用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友好,用户还得移动手指去按dial ...

  8. Android中的“再按一次返回键退出程序”代码实现

    1 用户在退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用也是这么做的,但也有些应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友 ...

  9. Android中实现两次点击返回键退出本程序

    1,当用户使用我们的app的时候,有时候无意的或者不是有心的按下了我们的返回键,这时候为了更好的用体验,我们需要让用户再一次确定一下,以便判断用户的真实意图 代码如下: //该功能实现退出时提示的功能 ...

随机推荐

  1. 2018秋季C语言学习总结

    2018秋季开始学习c语言 1.printf格式化输出函数 2.基本数据类型,int整型,float浮点型,double双精度浮点型,char字符型 3.算数运算符 +加法,-减法,*乘法,/除法,% ...

  2. 金蝶KIS&K3助记码SQL数据库批量刷新

    金蝶KIS&K3助记码SQL数据库批量刷新 用的次数不多,就没有写入存储过程或者触发里面了,可以自行实现. 第一步选择对应账套的数据库,执行下面的命令,这个是一个函数. go if exist ...

  3. 新世界主机_XenServer7.0都有哪些优势?

    新世界主机VPS全部都采用了Xen硬件虚拟化技术,每个用户都能够独享资源,一键就可以创建和重装VPS,每个VPS都拥有足够的带宽,保证顺畅运行(http://m.0830mn.com). 新世界主机使 ...

  4. Noj - 在线强化训练3

    状态 题号 竞赛题号 标题   1091 A 求解逆波兰表达式(Calculate the reverse Polish notation)   1017 B 数列   1323 C 穷举n位二进制数 ...

  5. port bridge enable命令导致的环路

    1.故障描述 前几天机房一台连接数据中心与核心交换的交换机宕机(硬件故障),机房有备用的设备,随即更换(配置也是早就配置好了的),但是下午就出现数据中心网络丢包问题,表现为存在mac漂移 2.拓扑 核 ...

  6. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

  7. mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)

    1.进入终端命令行 (1)输入:cd .ssh/ 进入到.ssh后,输入ls,会输出“known_hosts”,如果没有创建过rsa的话 (2)输入:man ssh-add (3)输入:ssh-key ...

  8. Python(一)缺点

    (一)慢~~~ (二)Python不能加密

  9. 关于*.ashx 处理程序调试时 未能创建类型 错误

    出现改问题的根本原因是因为,我更改过改类型的名字,而IDE并没有更改  ***.ashx. 注册类型名字. 所更改的类的名字应该是  "项目名字.文件名字“ 例如下图 应该更改类为 ”Wx_ ...

  10. 使对象可以像数组一样进行foreach循环,要求属性必须是私有

    class myIterator implements Iterator { private $var = array(1, 2, 3, 4, 5); public function __constr ...