这几天在做FragmentTabHost+FragmentActivity+多个Fragment做主页面框架时会偶尔出现fragmentgetActivity() 获取为null的情况,下面我就来还原场景。
1、在FragmentActivity中初始化并调用RefreshMainUI()
a、在FragmentActivity中初始化
private void initTab() {
//开始的这两行就是罪魁祸首。
chatHistoryFragment = new ChatHistoryFragment();
contactListFragment = new HXContactlistFragment();
mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
mTextviewArray = getResources().getStringArray(R.array.menu);
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
mTabHost.getTabWidget().setDividerDrawable(android.R.color.white);
// 将Tab按钮添加进Tab选项卡中
for (int i = 0; i < mImageViewArray.length; i++) {
// 为Tab按钮设置图标、文字和内容
TabSpec tabSpec = mTabHost.newTabSpec(mTextviewArray[i])
.setIndicator(getTabItemView(i));
mTabHost.addTab(tabSpec, mClass[i], null);
}
mTabHost.setCurrentTab(tab1);
}
b、在activity中监听联系人的变化和会话列表的变化后来调用此方法刷新该两个页面的数据
private void RefreshMainUI() {
try {
if (chatHistoryFragment != null) {
System.out.println("chatHistoryFragment 不为空");
} else {
System.out.println("chatHistoryFragment空");
}
contactListFragment.refresh();
chatHistoryFragment.refresh();
} catch (Exception e) {
e.printStackTrace();
}
}
2、在tab1的HXContactlistFragment中有这么个方法,主要是来刷新联系人列表的。
public void refresh() {
try {
if (getActivity() == null) {
return;
}
// 可能会在子线程中调到这方法
getActivity().runOnUiThread(new Runnable() {
public void run() {
getContactList();
adapter.notifyDataSetInvalidated();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
在getActivity()的时候总是为null,并且adapter也是为null。
3、后来修改了如下:在FragmentActivity中修改RefreshMainUI来刷新tab0和tab1
private void RefreshMainUI(){
HXContactlistFragment fragment = (HXContactlistFragment) getSupportFragmentManager()
.findFragmentByTag(mTextviewArray[1]);
if (null != fragment) {
fragment.refresh();
}
ChatAllHistoryFragment fragment0 = (ChatAllHistoryFragment) getSupportFragmentManager()
.findFragmentByTag(mTextviewArray[0]);
if (null != fragment0) {
fragment0.refresh();
}
}
实际上我new ChatAllHistoryFragment的实例和(ChatAllHistoryFragment) getSupportFragmentManager()
.findFragmentByTag(mTextviewArray[0])这个实例是两个fragment,所以导致了用最初的方式无论如何获取fragment里面的变量都是为null的原因。