父fragment刷新子fragment无反应问题解决方法

 

项目遇见一个问题,父fragment在没有登陆的时候显示“登录”按钮,要求登录才能让子fragment的内容可见。


其实点击父fragment的时候被隐藏不可见的子fragment就已经被创建了,但是这时候因为还没有登录,所以用户名是空字符串,没法通过用户名从服务器获取数据。


这时候登陆完finish掉登录.activity,会执行父fragment.onActivityResult方法,将用户名放在显示用户名的TextView上。

我在子fragment里面重写了onResume方法:

  @Override
    public void onResume() {
        getPublishDetail();
        super.onResume();
    }
getPublishDetail方法用来获取数据,并为listview设置BaseAdapter。


然后本想用父fragment去刷新子fragment,于是在子fragment里面定义了refrash方法,refrash可以重新获取数据,但是运行的时候总也不显示。

在父fragment里面获取子fragment的方法在下面:

首先为子fragment设置tag

FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        FragmentPublishINGRentOut publishFragment = new FragmentPublishINGRentOut();
        FragmentConsumptionRentOut consumptionFragment = new FragmentConsumptionRentOut();
        FragmentFinashedRentOut finashedFragment = new FragmentFinashedRentOut();
        FragmentRefundRentOut refundFragment = new FragmentRefundRentOut();

        transaction.add(publishFragment, "publishFragment");
        transaction.add(consumptionFragment, "consumptionFragment");
        transaction.add(finashedFragment, "finashedFragment");
        transaction.add(refundFragment, "refundFragment");

        transaction.commit();

然后通过tag获取到子fragment,并调用refrash方法,refrash方法有一个参数:userName,通过传入的用户名重新获取数据,调用 getPublishDetail方法。

        FragmentPublishINGRentOut publish = (FragmentPublishINGRentOut) getFragmentManager().findFragmentByTag("publishFragment");
        publish.refrash(userName);
结果就是不显示!!!!!什么鬼?

查了好多资料,也改了好多次,尝试去掉这些,在onResume方法里面加上几句话:

    @Override
    public void onResume() {
        NavigationView navigationView = (NavigationView) getActivity().findViewById(R.id.nav_view);
        View heardLayout = navigationView.getHeaderView(0);
        TextView phoneNumber = (TextView) heardLayout.findViewById(R.id.phoneNumberTextView_navigationBarHeader);
        strPhoneNumber = phoneNumber.getText().toString();
        getPublishDetail();
        super.onResume();
    }
前面几句主要功能就是重新获取到用户名:strPhoneNum,然后再获取,居然成功了。

找了一些资料,onResume方法是在布局显示在屏幕上被用户可见时调用,仔细想了一下,最开始子fragment的布局是被隐藏的,虽然被创建了,但是不可见,当登录成功后,子fragment的内容显示了,这时候会调用onResume方法。

那么为什么最开始没重新获取用户名的时候不显示呢?原因是这样的:当子fragment的内容被用户可见的时候,子fragment其实早在父fragment被点击显示的时候就已经被创建了,虽然变味了可见状态,但是只会重新执行onResume方法,并不会重新执行onCreate方法和onCreateView方法,可是获取用户名的操作在onCreateView方法里面,那个时候获取到的还只是空字符串,所以即使调用了onResume方法传给服务器的也只是空字符串,这样是查不到数据的,所以仍然显示一片空白,没有数据可以显示。


下面附其他人写的文章,生命周期:

https://wenku.baidu.com/view/38de45165f0e7cd1842536d5.html

http://blog.csdn.net/hjj0212/article/details/8530273






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值