项目遇见一个问题,父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