Android 何时引用在ViewPager中创建的片段

Android 何时引用在ViewPager中创建的片段,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我有一个ViewPager,它将两个片段设置为可切换选项卡。我试图在托管活动中找到这些片段 我将它们设置为类全局变量: private SharedBillFragment sharedBill; private SeparateBillFragment separateBill; 并尝试在活动的onStart()中找到它们: findFragments()的位置(我知道这是一种黑客行为,但目前应该可以使用……): 但这不起作用,没有找到碎片。当我在稍后调用的方法中调用findFragment

我有一个ViewPager,它将两个片段设置为可切换选项卡。我试图在托管活动中找到这些片段

我将它们设置为类全局变量:

private SharedBillFragment sharedBill;
private SeparateBillFragment separateBill;
并尝试在活动的onStart()中找到它们:

findFragments()的位置(我知道这是一种黑客行为,但目前应该可以使用……):

但这不起作用,没有找到碎片。当我在稍后调用的方法中调用findFragments()时(在用户交互之后),就会找到片段,我可以使用它们。例如:

private void setCountryTip(String selectedCountry) {
    findFragments();

    sharedBill.setPercentage(getCountryTip(selectedCountry));
    separateBill.setPercentage(getCountryTip(selectedCountry));
}
但是,即使在调用findFragments()时,片段也只在调用findFragments()的方法中可用,即使我将它们设置为类全局变量

最好的情况是,我希望在应用程序启动时找到片段,并将它们存储在类全局变量中。如何实现这一点有什么帮助吗

编辑: 有关如何设置我的片段的更多信息。在我的主要活动中,我有:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String[] mTabTitles = getResources().getStringArray(R.array.tabs);
    final ActionBar actionBar = getActionBar();

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    mTabsAdapter = new TabsAdapter(getFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.viewPager);
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });

    mViewPager.setAdapter(mTabsAdapter);

    for (String tab_name : mTabTitles) {
        actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
    }
}
还有我的TabsAdapter:

public class TabsAdapter extends FragmentPagerAdapter {
final int NUMBER_OF_TABS = 2;

public TabsAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {
    switch (index) {
        case 0:
            return new SharedBillFragment();
        case 1:
            return new SeparateBillFragment();
    }

    return null;
}

@Override
public int getCount() {
    return NUMBER_OF_TABS;
}
}
编辑:关于NPE,我的微调器在片段中的设置如下:

private Spinner spCountry;

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    spCountry = (Spinner) getActivity().findViewById(R.id.spCountry);
    spCountry.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long l) {
            mCallback.onCountrySelected(spCountry.getItemAtPosition(pos).toString());
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {
        }
    });
}

public void setCountry(String country) {
    ArrayAdapter spCountryAdapter = (ArrayAdapter) spCountry.getAdapter();
    spCountry.setSelection(spCountryAdapter.getPosition(country));
}
私人纺纱机;
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
spCountry=(微调器)getActivity().findViewById(R.id.spCountry);
spCountry.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView AdapterView、视图视图、内部位置、长l){
mCallback.onCountrySelected(spCountry.getItemAtPosition(pos.toString());
}
@凌驾
未选择公共无效(AdapterView AdapterView){
}
});
}
公共国家/地区(字符串国家/地区){
ArrayAdapter spCountryAdapter=(ArrayAdapter)spCountry.getAdapter();
spCountry.setSelection(spCountryAdapter.getPosition(country));
}

微调器通过xml属性“android:entries”获取其条目。

这不是一个很好且可重用的解决方案,但由于您使用的是静态片段,因此它可以工作:使适配器类型为片段,并在活动中初始化片段。然后将这两个片段添加到适配器中,并在adapters getItem函数中仅返回相应的片段

适配器:

public class TabsAdapter extends FragmentPagerAdapter {
List<Fragment> fragments;

public TabsAdapter(FragmentManager fm, List<Fragment> fragments) {
    super(fm);
    this.fragments = fragments;
}

@Override
public Fragment getItem(int index) {
    return fragments.get(index);
}

@Override
public int getCount() {
    return fragments.size();
}
}

谢谢你的回答。我对Android编程有点陌生,因此我很难跟上你,你能用一些代码示例来扩展你的答案吗?我编辑了我的问题以显示我的片段现在是如何设置的。谢谢,这很好!但是当使用这个解决方案时,当在试图设置微调器的片段中调用一个方法时,我会得到一个NPE。当我像以前那样设置片段时,我没有得到这个异常。查看原始帖子,了解“我的微调器”是如何设置的。是的,这是因为视图尚未附加到活动。在onCreateView中找到片段(编辑了我的答案)只是尝试了一下,我仍然得到了NPE。我正在调用活动的onStart()中的fragment方法,这可能是个问题?什么样的fragment方法?哪一行抛出NPE?
private Spinner spCountry;

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    spCountry = (Spinner) getActivity().findViewById(R.id.spCountry);
    spCountry.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long l) {
            mCallback.onCountrySelected(spCountry.getItemAtPosition(pos).toString());
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {
        }
    });
}

public void setCountry(String country) {
    ArrayAdapter spCountryAdapter = (ArrayAdapter) spCountry.getAdapter();
    spCountry.setSelection(spCountryAdapter.getPosition(country));
}
public class TabsAdapter extends FragmentPagerAdapter {
List<Fragment> fragments;

public TabsAdapter(FragmentManager fm, List<Fragment> fragments) {
    super(fm);
    this.fragments = fragments;
}

@Override
public Fragment getItem(int index) {
    return fragments.get(index);
}

@Override
public int getCount() {
    return fragments.size();
}
}
    sharedBillFragment = new SharedBillFragment();
    separateBillFragment = new SeparateBillFragment();
    List<Fragment> fragments = new ArrayList<Fragment>();
    fragments.add(sharedBillFragment);
    fragments.add(separateBillFragment);
    mTabsAdapter = new TabsAdapter(getFragmentManager(), fragments);
    mViewPager = (ViewPager) findViewById(R.id.viewPager);
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });

    mViewPager.setAdapter(mTabsAdapter);
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   View v = inflater.inflate(R.layout.fragment, containter, false);
   spCountry = (Spinner) getActivity().findViewById(R.id.spCountry);
   ...
   return v;
}