2

更新
我认为它与屏幕方向有关。事实上,当我在不改变设备方向的情况下播放不同的动作时,它不会导致任何问题,小部件被正确评估。一旦我改变方向,所有小部件在返回原始活动时都会变为空。

原始帖子

我在 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。我需要更改设备的方向,以便重新创建第一个活动及其所有子片段。但是我无法将它发送给我的最终用户:/

因此,任何帮助将不胜感激。

提前致谢。

4

0 回答 0