问题:
如图,"发现" 页即为主页, 然后我们切换到 "我" 页, 一切正常.
那么问题来了, 如果切换到 "我" 页后把手机横屏, 则会出现下面的情况.
嗯? 怎么又回到 "发现" 页了??
解决办法:
思考
据自己了解, 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》中的资源
来源: https://www.cnblogs.com/HenuAJY/p/10739954.html