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