gpt4 book ai didi

android - 如何从 ViewPager 调用 Fragment 的方法?

转载 作者:行者123 更新时间:2023-11-29 01:06:30 26 4
gpt4 key购买 nike

我有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com