Roman Nurik的向导寻呼机 - 如何访问收集的数据?

时间:2013-02-08 04:08:07

标签: android nullpointerexception wizard

我正在尝试使用Roman Nurik的库(https://plus.google.com/113735310430199015092/posts/6cVymZvn3f4)创建一个向导。

我无法从Review Fragment访问收集的数据。 我在ReviewFragment中公开了mCurrentReviewItems,然后我就像这样尝试了

mNextButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (mPager.getCurrentItem() == mCurrentPageSequence.size()) {
            ReviewFragment reviewFragment = (ReviewFragment)  mPagerAdapter.getItem(mPager.getCurrentItem());

            for (ReviewItem item : reviewFragment.mCurrentReviewItems)
                Log.d(MainActivity.TAG, "Item: " + item.getDisplayValue());
            }

        } else {
            if (mEditingAfterReview) {
                mPager.setCurrentItem(mPagerAdapter.getCount() - 1);
            } else {
                    mPager.setCurrentItem(mPager.getCurrentItem() + 1);
            }
        }
   }
});

然而它总是空的。

5 个答案:

答案 0 :(得分:11)

内部if (mPager.getCurrentItem() == mCurrentPageSequence.size()) { }

对于单页变量:

String data = mWizardModel.findByKey("Sandwich:Bread").getData().getString(Page.SIMPLE_DATA_KEY);

对于自定义页面:

String data = 
mWizardModel.findByKey(THE_KEY).getData().getString(CustomerInfoPage.YOUR_DATA_KEY);

如果要将数据分配回向导,请将其放在FragmentActivity中onCreate的末尾:

Bundle data = new Bundle();
if (!TextUtils.isEmpty(DATA_STRING)) {
    data.putString(Page.SIMPLE_DATA_KEY, DATA_STRING);
    mWizardModel.findByKey("Sandwich:Bread"").resetData(data);
}

关键词“三明治:面包”就是一个例子,改变任何适合你的方式。永远不要尝试多人,我认为它或多或少是相同的。

答案 1 :(得分:3)

很抱歉有很大的延迟,但我认为有人会发现此信息很有用。我找到了获得所有ReviewItems的方法,因为你可以拥有很多分支,而你却无法使用第一个答案。

我很确定,您的mPagerAdapter::getItem代码在示例中看起来像(因此它只返回了新的片段,而不是返回当前的寻呼机片段)。您必须使用instantiateItem来参考ReviewFragment

Object o = mPager.getAdapter().instantiateItem(mPager, mPager.getCurrentItem());
if(o instanceof ReviewFragment) {
  List<ReviewItem> items = ((ReviewFragment) o).getCurrentReviewItems();
  if(items != null) {
    Log.v(TAG, "Items are: " + items.toString());
  }
}

答案 2 :(得分:0)

这是我的代码@Anton_Shkurenko

mNextButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mPager.getCurrentItem() == mCurrentPageSequence.size()) {
                Object o = mPager.getAdapter().instantiateItem(mPager, mPager.getCurrentItem());
                if(o instanceof ReviewFragment) {
                    List<ReviewItem> items = ((ReviewFragment) o).getCurrentReviewItems();
                    if(items != null) {
                        Log.v(TAG, "Items are: " + items.toString());
                    }
                }
            }
        }
    });

答案 3 :(得分:0)

最佳解决方案是将此库作为模块包含在项目中,并在ReviewFragment中实现自己的获取审阅项的方法。

public List<ReviewItem> getReviewItems() {
    return mCurrentReviewItems;
}

我不确定开发人员为什么不添加它。这是项目中最重要的事情。选择项目并与他们做点什么。

答案 4 :(得分:0)

任何仍在寻找解决方案的人都可以使用以下代码

    ArrayList<ReviewItem> reviewItems = new ArrayList<ReviewItem>();
    for (Page page : mWizardModel.getCurrentPageSequence()) {
        page.getReviewItems(reviewItems);
    }