android横竖屏切换函数,关于Android中使用BottomNavigationView切换横屏导致返回主页的问题...

问题:

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

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSGRBbGFuL215QmxvZ0ltYWdlcy9tYXN0ZXIvQXBwX0hvbWVfUGFnZS5wbmc=.jpg

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSGRBbGFuL215QmxvZ0ltYWdlcy9tYXN0ZXIvQXBwX01lX1BhZ2UucG5n.jpg

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

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSGRBbGFuL215QmxvZ0ltYWdlcy9tYXN0ZXIvQXBwX0hlbmdQaW5nX1BhZ2UucG5n.jpg

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

解决办法:

思考

据自己了解,Android应用程序刷新页面有两种情况,第一种是用户操作;

第二种非用户操作,即系统触发的。很明显这是系统触发的咯。

然后,搬来Android应用程序生命周期图:

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSGRBbGFuL215QmxvZ0ltYWdlcy9tYXN0ZXIvQW5kcm9pZF9MaWZlX0NpcmNsZS5wbmc=.jpg

看到,在整个生命周期中,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输出如下:

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSGRBbGFuL215QmxvZ0ltYWdlcy9tYXN0ZXIvTG9nQ2F0TG9nLnBuZw==.jpg

仔细观察发现,横屏后,程序再次调用了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;

}

}

}

再次横屏,

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSGRBbGFuL215QmxvZ0ltYWdlcy9tYXN0ZXIvQXBwX0hlbmdQaW5nX1BhZ2UyLnBuZw==.jpg

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中的“再按一次返回键退出程序”实现 (转) 按返回键退出程序时进行提醒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值