- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 4 种类型的 fragment : OpenTextFragment、SingleRadioButtonFragment、DropdownSelectFragment 和 MultipleCheckboxesFragment
根据我使用的元素类型,这些 fragment 显示在 ViewPager 中。在这些 fragment 中有一个特定的函数(每个 fragment 都是唯一的),我需要从我的 MainActivity
中使用它。
ViewPager 可以有 N 个上面提到的不同 fragment
我需要什么
我需要获取 ViewPager 中的当前 fragment 并使用其中的特定功能。
我在做什么
我在 ViewPager 中显示这些 fragment 的方式是使用 FragmentPagerAdapter
:
public class QuestionsAdapter extends FragmentPagerAdapter {
private ArrayList<SurveyElement> mSurveyElements;
private int mAdapterSize = 0;
public QuestionsAdapter(FragmentManager fm) {
super(fm);
}
public void updateFragmentAdapter(ArrayList<SurveyElement> fragmentList) {
mSurveyElements = fragmentList;
mAdapterSize = fragmentList.size();
this.notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
SurveyElement surveyElement = mSurveyElements.get(position);
switch (surveyElement.getElementType()) {
case SurveyElement.OPEN_TEXT:
return OpenTextFragment.newInstance(surveyElement, position + 1);
case SurveyElement.SINGLE_RADIOBUTTON:
return SingleRadioButtonFragment.newInstance(surveyElement, position + 1);
case SurveyElement.DROPDOWN_SELECT:
return DropdownSelectFragment.newInstance(surveyElement, position + 1);
case SurveyElement.MULTIPLE_CHECKBOXES:
return MultipleCheckboxesFragment.newInstance(surveyElement, position + 1);
default:
return OpenTextFragment.newInstance(surveyElement, position + 1);
}
}
@Override
public int getCount() {
return mAdapterSize;
}
}
我试图在 MainAcitivity
中使用此函数获取当前 fragment
private boolean canIGoToNextQuestion(int position){ // mMyViewPager.getCurrentItem()
if (mQuestionsAdapter.getItem(position) instanceof OpenTextFragment){
OpenTextFragment openTextFragment = (OpenTextFragment) mQuestionsAdapter.getItem(position);
return openTextFragment.attemptAnswerQuestion();
}
// here goes the validations for the others fragments types
return false;
}
我被困住了
当调用函数 attemptAnswerQuestion()
时,此函数内的所有元素都是 null
。
我似乎正在制作一个新的 OpenTextFragment
实例。
很高兴知道
我看过几篇关于这个主题的帖子,但所有这些你都知道你的 fragment 的位置,但在我的例子中可能是这样的:
OpenTextFragment
可以在位置0,
DropdownSelectFragment
在位置 1,
MultipleCheckboxesFragment
位置 2,
再次 OpenTextFragment
在位置 3 等等...
最佳答案
在 FragmentPagerAdapter 中使用 instantiateItem()
覆盖,以便为 ViewPager 中已实例化的 fragment 保留引用。
由于您在 ViewPager 中有可变数量的 fragment ,因此使用 Map 将索引映射到每个 fragment :
public class QuestionsAdapter extends FragmentPagerAdapter {
private ArrayList<SurveyElement> mSurveyElements;
private int mAdapterSize = 0;
//Fragment container:
Map<Integer, Fragment> mFragmentMap = new HashMap<>();
public QuestionsAdapter(FragmentManager fm) {
super(fm);
}
public void updateFragmentAdapter(ArrayList<SurveyElement> fragmentList) {
mSurveyElements = fragmentList;
mAdapterSize = fragmentList.size();
this.notifyDataSetChanged();
}
//This populates your Fragment reference map:
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
mFragmentMap.put(position, createdFragment);
return createdFragment;
}
@Override
public Fragment getItem(int position) {
SurveyElement surveyElement = mSurveyElements.get(position);
switch (surveyElement.getElementType()) {
case SurveyElement.OPEN_TEXT:
return OpenTextFragment.newInstance(surveyElement, position + 1);
case SurveyElement.SINGLE_RADIOBUTTON:
return SingleRadioButtonFragment.newInstance(surveyElement, position + 1);
case SurveyElement.DROPDOWN_SELECT:
return DropdownSelectFragment.newInstance(surveyElement, position + 1);
case SurveyElement.MULTIPLE_CHECKBOXES:
return MultipleCheckboxesFragment.newInstance(surveyElement, position + 1);
default:
return OpenTextFragment.newInstance(surveyElement, position + 1);
}
}
@Override
public int getCount() {
return mAdapterSize;
}
}
然后,您可以在 Activity 中使用下面的代码为每种类型的 fragment 调用适当的方法。关键是引用在 ViewPager 中实例化和显示的实际 fragment :
private boolean canIGoToNextQuestion(int position){ // mMyViewPager.getCurrentItem()
Fragment fragment = mQuestionsAdapter.mFragmentMap.get(position);
if (fragment != null && fragment instanceof OpenTextFragment){
return ((OpenTextFragment)fragment).attemptAnswerQuestion();
}
return false;
}
关于android - 如何从 ViewPager 调用 Fragment 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46652702/
我是一名优秀的程序员,十分优秀!