从另一个活动返回时,Android片段小部件为空

时间:2012-07-07 22:26:00

标签: android android-viewpager fragment lifecycle

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

原始发布

我在使用Fragments或FragmentPagerAdapter的生命周期时遇到问题,我不太清楚是什么导致了我的问题。

请注意我是Fragments的新手,我一定是误解或遗忘了某些内容,但我无法在现有帖子中找到任何答案。另请注意,我正在使用兼容包以及ActionBarSherlock和ViewPageIndicator库。

无论如何,这是我的情况:
  - 我有一个SherlockFragmentActivity A,其目标是显示一个包含两个片段的ViewPager,这两个片段都继承了SherlockFragment。到目前为止,一切正常,与两个片段相关的视图都是正确的,我可以用小部件做任何我想做的事   - 在ActionBar中,用户可以单击调出SherlockActivity B的项目,以便输入和验证某些数据或取消输入。活动B以startActivityForResult()开始,因为我期望活动A中有结果。

如果用户输入并验证活动B显示的表单,那么想法是在活动A的onActivityResult()中刷新ViewPager中的两个片段的内容。

但是,当我尝试在onActivityResult()中更新片段的视图时,如果用户已经验证了表单,则两个片段中的所有小部件现在都为空。碎片首次出现时它们不是空的,但现在它们是,我还没有找到任何方法来获得它们的初始值。我试图玩活动生命周期,但没有成功。

以下是我的代码中最重要的部分:

适配器

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();
}

}

我没有在这里放置所有代码,但最重要的部分是存在的。如您所见,片段的onCreateView()方法调用refreshGameRows(),片段的refresh()方法也是如此。因此,两种方法在UI呈现方面基本相同。

但是,当在TabGameSetActivity类的onActivityResult()中调用方法refresh()时,所有片段小部件都为null:gamesLayout,mViewTabGameSet ...由于onCreateView()以前被调用和评估过,所以我不明白适当的所有对象。

现在,抛出异常,因此ui不会更新。我需要更改设备的方向,以便重新创建第一个活动及其所有子片段。但是我无法将其发送给我的最终用户:/

所以任何帮助都会非常感激。

提前致谢。

0 个答案:

没有答案
相关问题