更新
我认为它与屏幕方向有关。事实上,当我在不改变设备方向的情况下播放不同的动作时,它不会导致任何问题,小部件被正确评估。一旦我改变方向,所有小部件在返回原始活动时都会变为空。
原始帖子
我在 Fragments 或 FragmentPagerAdapter 的生命周期中遇到问题,我不太清楚是什么导致了我的问题。
请注意,我是 Fragments 的新手,我一定误解或忘记了一些东西,但我无法在现有帖子上找到任何答案。另外,请注意,我使用的是兼容性包以及两个库 ActionBarSherlock 和 ViewPageIndicator。
无论如何,这是我的情况:
- 我有一个 SherlockFragmentActivity A,其目标是显示一个包含两个片段的 ViewPager,两个片段都继承 SherlockFragment。到目前为止,一切正常,与两个片段关联的视图都是正确的,我可以对小部件做任何我想做的事情。
- 在 ActionBar 中,用户可以单击显示 SherlockActivity B 的项目,这样他就可以输入并验证某些数据或取消输入。活动 B 以 startActivityForResult() 开始,因为我期待活动 A 中的结果。
这个想法是如果用户输入并验证活动 B 显示的表单,则在活动 A 的 onActivityResult() 中刷新 ViewPager 中的两个片段的内容。
但是,当我尝试在 onActivityResult() 中更新片段的视图时,如果用户已经验证了表单,那么两个片段中的所有小部件现在都为空。当 Fragments 首次出现时它们不是空的,但现在它们是空的,我还没有想出任何方法来获取它们的初始值。我试图玩活动生命周期,但没有成功。
这是我的代码中最重要的部分:
适配器
public class TabGameSetPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments;
public TabGameSetPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
switch(position) {
case 0:
return App.getApplication().getString(R.string.lblGamesTitle);
case 1:
return App.getApplication().getString(R.string.lblSynthesisTitle);
default:
return "Unknown[" + position + "]";
}
}
寻呼机的活动
public class TabGameSetActivity extends SherlockFragmentActivity implements IRefreshableGameSetContainer {
private ViewPager mPager;
private PagerAdapter mPagerAdapter;
private GameSetGamesFragment gameSetGamesFragment = GameSetGamesFragment.newInstance();
private GameSetSynthesisFragment gameSetSynthesisFragment = GameSetSynthesisFragment.newInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.simple_titles);
// initialize the pager
this.initialisePaging();
}
catch (Exception e) {
AuditHelper.handleActivityException(this, e);
}
}
private void initialisePaging() {
this.gameSetGamesFragment = GameSetGamesFragment.newInstance();
this.gameSetSynthesisFragment = GameSetSynthesisFragment.newInstance();
List<Fragment> fragments = newArrayList();
fragments.add(this.gameSetGamesFragment);
fragments.add(this.gameSetSynthesisFragment);
this.mPagerAdapter = new TabGameSetPagerAdapter(super.getSupportFragmentManager(), fragments);
this.mPager = (ViewPager) super.findViewById(R.id.pager);
this.mPager.setAdapter(this.mPagerAdapter);
this.mPager.setCurrentItem(this.startPage-1);
TitlePageIndicator indicator = (TitlePageIndicator)findViewById(R.id.indicator);
indicator.setViewPager(mPager);
indicator.setFooterIndicatorStyle(IndicatorStyle.Triangle);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
if (requestCode == RequestCodes.ADD_GAME) {
if (resultCode == ResultCodes.AddGame_Ok) {
this.refresh();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void refresh() {
this.gameSetGamesFragment.refresh();
this.gameSetSynthesisFragment.refresh();
}
}
尤其是 onActivityResult() 处理对两个片段上的 refresh() 方法的调用。
碎片之一
public class GameSetGamesFragment extends SherlockFragment implements IRefreshableGameSetContainer {
private View mViewTabGameSet;
private LinearLayout playersLayout;
private LinearLayout gamesLayout;
private ScoresRow playerScoresRow;
private PlayersRow playersRow;
public static GameSetGamesFragment newInstance() {
return new GameSetGamesFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
this.mViewTabGameSet = inflater.inflate(R.layout.tablegameset, null);
this.playersLayout = (LinearLayout)this.mViewTabGameSet.findViewById(R.id.playersLayout);
this.gamesLayout = (LinearLayout)this.mViewTabGameSet.findViewById(R.id.gamesLayout);
this.playerScoresRow = new ScoresRow(this.getActivity(), App.getBizService().getPlayers());
this.playersRow = new PlayersRow(this.getActivity(), App.getBizService().getPlayers());
this.playersLayout.addView(this.playersRow);
this.playersLayout.addView(this.playerScoresRow);
this.progressDialog = new ProgressDialog(this.getActivity());
this.refreshGameRows();
return this.mViewTabGameSet;
}
protected void refreshGameRows() {
this.gamesLayout.removeAllViews();
for (View rowToDisplay : rowsToDisplay) {
this.gamesLayout.addView(rowToDisplay);
}
...
}
@Override
public void refresh() {
this.refreshGameRows();
}
}
我没有把我所有的代码都放在这里,但最重要的部分已经存在。如您所见,fragment 的 onCreateView() 方法调用 refreshGameRows(),fragment 的 refresh() 方法也是如此。所以这两种方法在 UI 渲染方面基本相同。
但是,当在 TabGameSetActivity 类的 onActivityResult() 中调用方法 refresh() 时,所有片段小部件都为空:gamesLayout、mViewTabGameSet ... 我不明白,因为之前调用了 onCreateView() 并正确评估了所有对象。
现在,抛出异常,因此不更新 ui。我需要更改设备的方向,以便重新创建第一个活动及其所有子片段。但是我无法将它发送给我的最终用户:/
因此,任何帮助将不胜感激。
提前致谢。