我创建了一个标签式应用,主要活动包含两个布局。顶部布局包含实际的tabbar(这是一个片段)。根据用户单击的标签栏按钮,内容布局包含其他片段。为了与旧的Android版本保持兼容,我使用android.support.v4.app.Fragment
。
因此,在标签栏菜单中我添加了两个按钮,每个按钮触发内容中的另一个片段。这就是代码的样子:
public class TabbarMenuFragment extends Fragment implements View.OnClickListener {
LiveFragment liveFragment;
OddsFragment oddsFragment;
FragmentTransaction fragmentTransaction;
Button liveButton;
Button oddsButton;
public TabbarMenuFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
liveFragment = new LiveFragment();
oddsFragment = new OddsFragment();
fragmentTransaction = getFragmentManager().beginTransaction().add(R.id.content_view, oddsFragment);
fragmentTransaction.commit();
View rootView = (View) inflater.inflate(R.layout.tabbar_menu, container, false);
liveButton = (Button) rootView.findViewById(R.id.liveButton);
liveButton.setOnClickListener(this);
oddsButton = (Button) rootView.findViewById(R.id.oddsButton);
oddsButton.setOnClickListener(this);
return rootView;
}
public void updateUIInTabs() {
liveFragment.updateUI();
}
@Override
public void onClick(View v) {
if(v == liveButton) {
fragmentTransaction = getFragmentManager().beginTransaction().replace(R.id.content_view, liveFragment);
fragmentTransaction.commit();
}
if(v == oddsButton) {
fragmentTransaction = getFragmentManager().beginTransaction().replace(R.id.content_view, oddsFragment);
fragmentTransaction.commit();
}
updateUIInTabs();
}
}
重要的是,liveFragment
是Fragment
,其中包含ListView
:
public class LiveFragment extends Fragment {
LiveMainAdapter adapter;
ListView list;
LayoutInflater inflater;
View rootView;
public LiveFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
this.inflater = inflater;
rootView = (View) inflater.inflate(R.layout.live_fragment, container, false);
adapter = new LiveMainAdapter(inflater);
list = (ListView) rootView.findViewById(R.id.live_fragment_ListView);
list.setAdapter(adapter);
list.setDivider(null);
list.setDividerHeight(0);
return rootView;
}
public void updateUI() {
if(list != null) {
list.invalidate();
adapter.createRowObjects();
adapter.notifyDataSetChanged();
}
}
}
到目前为止,oddsFragment
只是一个假人,TextView
:
public class OddsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = (View) inflater.inflate(R.layout.odds_fragment, container, false);
return rootView;
}
}
现在有两个重要的设置:
首先:
如上所述:我启动应用程序并初始显示oddsFragment
。现在,当我点击liveFragment
按钮时,liveFragment
' ListView
未更新。
再次单击oddsFragment
按钮oddsFragment
已正确显示。点击返回liveFragment
我什么都没得到 - 没有显示ListView
。
第二个设定:
与第一个完全相同,但我将liveFragment
设置为TabbarMenuFragment
我替换的初始视图:
fragmentTransaction = getFragmentManager().beginTransaction().add(R.id.content_view, oddsFragment);
与
fragmentTransaction = getFragmentManager().beginTransaction().add(R.id.content_view, liveFragment);
然后正确显示ListView
并更新列表视图中的数据并正确显示。但是,如果我点击oddsFragement
,然后再点击liveFragement
,ListView
就会消失。
我已经尝试了两个多小时不同的事情而且我非常绝望,因为我不知道这种有线行为可能是什么原因。
有人知道这里发生了什么事吗?
答案 0 :(得分:0)
试一试......
在LiveFragment
添加Handler
和Runnable
并从Runnable更新用户界面。
Handler handler = new Handler();
Runnable updater = new Runnable()
{
public void run()
{
if(list != null) {
list.invalidate();
adapter.createRowObjects();
adapter.notifyDataSetChanged();
}
}
};
然后更改updateUI()
LiveFragment
方法
public void updateUI()
{
handler.post(updater);
}