Android Fragment使用hide和show方法的问题

       Fragment的强大是毋庸置疑的,现在是越来越喜欢使用它了,但是使用中我也是头疼了好一阵,各种小bug层出,记录一下:

       我们使用Fragment去填充布局的时候,是有两种方法可以实现的:一种是使用fragment的管理器的replace()方法,另一种就是使用hide()和show()方法对Fragment显示隐藏。

很明显replace()方法就是不断的替换覆盖当前布局,每一次的replace()都会重新实例化一个Fragment,这种方法适合所销毁的Fragment不需要我们保存状态,每次都需要重新加载的,但是有时是不想不断的去实例化Fragment的这样也是比较耗时的(尤其是在网络较差时),而且很多时候业务上要求也不是要实时刷新数据的,这时候就要使用这hide和收尾方法了,不去每次都new一个Fragment。  之前我有写过hide和show方法(http://blog.csdn.net/my_jack/article/details/52934447),可以去看一下。

        当我使用hide和show方法的时候遇见了问题了,当我的三个Fragment A , B , C都实例化之后,我在B界面显示的时候,点击B界面会执行C界面的点击事件。当时真的是下了我这一下,好诡异啊。不断测试一下,发现当B界面没有了点击事件设置时会发生这种点击穿透布局的事件。应该是宿主保存了各个Fragment的状态了,所以在需要的Fragment中重写一下onSaveInstaceState方法就可以了:

 @Override
    protected void onSaveInstanceState(Bundle outState) {
        //阻止activity保存fragment的状态
        //super.onSaveInstanceState(outState);
    }

还在研究中,如果有更好的方法在更新喽大笑

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android 中,可以通过 hide() 和 show() 方法来切换 Fragment。具体的实现步骤如下: 1. 获取 FragmentManager 对象: ```java FragmentManager fragmentManager = getSupportFragmentManager(); ``` 2. 开启一个 FragmentTransaction 事务: ```java FragmentTransaction transaction = fragmentManager.beginTransaction(); ``` 3. 如果要切换到的 Fragment 还没有被添加到 Activity 中,则使用 add() 方法添加到容器中: ```java transaction.add(R.id.container, newFragment); ``` 4. 如果已经添加过,可以使用 show() 方法显示该 Fragment: ```java transaction.show(newFragment); ``` 5. 使用 hide() 方法隐藏当前的 Fragment: ```java transaction.hide(currentFragment); ``` 6. 最后,提交事务: ```java transaction.commit(); ``` 完整的示例代码如下: ```java // 获取 FragmentManager 对象 FragmentManager fragmentManager = getSupportFragmentManager(); // 开启一个 FragmentTransaction 事务 FragmentTransaction transaction = fragmentManager.beginTransaction(); // 如果要切换到的 Fragment 还没有被添加到 Activity 中,则添加到容器中 if (!newFragment.isAdded()) { transaction.add(R.id.container, newFragment); } // 隐藏当前的 Fragment transaction.hide(currentFragment); // 显示要切换到的 Fragment transaction.show(newFragment); // 提交事务 transaction.commit(); ``` 注意,这里的 currentFragment 和 newFragment 都是 Fragment 对象,需要根据具体的情况进行替换。同时,R.id.container 是一个 FrameLayout 容器,用来承载 Fragment
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值