我从一个被解析为Application类中对象的Web服务接收数据,在我的例子中,这个对象Report包含一个Tabs应该填充的列表ViewPager.因此,此报告存储在currentReportApplication类的参数中.
每个标签应该是一个页面ViewPager.因此,当我第一次收到数据并解析数据时,所有数据都能完美运行,并且View Pager会填充正确的数据并显示出来.
当我想Report从服务器获取新内容并ViewPager使用已解析为currentReport参数的新数据刷新时,我的问题就出现了.
我ViewPager可以刷卡并且有标签导航,因此当我尝试ViewPager使用新的重新实例化时,Report我看到添加了适量的标签tabHost.由于某种原因,新报告的片段覆盖了普通报告的片段.因此,如果新报告中的选项卡数量大于上一个报告中的选项卡,那么我可以看到上一个报告中的选项卡以及部分新选项卡(例如,在第一个报告中我有一个选项卡,以及在新的我有3然后我看到前一个片段和下一个片段中的最后一个片段).
我从本教程开始我的开发并添加了smoe代码:http://thepseudocoder.wordpress.com/2011/10/13/android-tabs-viewpager-swipe-able-tabs-ftw/
这是我的Tab活动代码:
public class TabsViewPagerFragmentActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener
{
static final String TAG = TabsViewPagerFragmentActivity.class.getSimpleName();
private TabHost mTabHost;
private ViewPager mViewPager;
private HashMap<String, TabInfo> mapTabInfo;
public ViewPagerAdapter mPagerAdapter;
private TextView tvReportName, tvTabTitle;
private Button bBackToParameters;
private Dialog progressDialog;
private SGRaportManagerAppObj application;
private int numberOfTabs = …Run Code Online (Sandbox Code Playgroud) 我写的应用程序有3个片段.当我按下搜索按钮时,主片段活动有一个带搜索按钮的搜索框,调用下面的函数:
Fragments.values()[tabControl.getCurrentItem()].getFragment().search(tv.getText().toString(), MainActivity.this.getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我按下HOME按钮等待30分钟并重新启动应用程序,在我按下FragmentYellowPagesFragment应用程序中的搜索按钮后崩溃
lvYellowPages.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)
因为lvYellowPages在这种情况下是null,但在日志中我可以看到该onCreateView函数被调用.能帮帮我吗,我可以和你分享我的代码.
public class FragmentAdapter extends FragmentPagerAdapter {
Fragments[] mFragments;
public FragmentAdapter(FragmentManager fm) {
super(fm);
mFragments = Fragments.values();
}
public enum Fragments {
Favorites(App.getStringByResId(R.string.favorites), new FragmentFavorites()),
Categories(App.getStringByResId(R.string.categories), new FragmentCategories()),
YellowPages(App.getStringByResId(R.string.yellow_pages), new FragmentYellowPages());
Fragments(String title, BaseListFragment fragment) {
this.mTitle = title;
this.mFragment = fragment;
}
String mTitle;
BaseListFragment mFragment;
public String getTitle() {
return mTitle;
}
public BaseListFragment getFragment() {
return mFragment;
}
};
@Override
public CharSequence getPageTitle(int position) …Run Code Online (Sandbox Code Playgroud) 我找到的唯一记录方式是:
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);
Run Code Online (Sandbox Code Playgroud)
但是由于Fragment是在ViewPager中实例化的,所以我没有id.
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
fragments.add(Fragment.instantiate(this, Fragment2.class.getName()));
fragments.add(Fragment.instantiate(this, Fragment3.class.getName()));
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个FragmentStatePagerAdapter,里面有6个片段.
每个Fragment连接到服务器并加载数据.
现在,服务器连接正在Fragment.onStart()中完成,这意味着在任何时候,我都有3个http请求(选定的片段,每侧一个).
我想要的是当时只有一个连接,所以我打算使用
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
{
@Override
public void onPageSelected(final int position)
{
CustomFragment fragment = (CustomFragment) myFragmentStatePagerAdapter.getItem(position);
fragment.onSelected();//do stuff in here
}
});
Run Code Online (Sandbox Code Playgroud)
问题是,getItem()返回片段的新实例,尚未添加到管理器(因此,尚未创建视图等).
此外,我已经尝试setUserVisibleHint(boolean isVisibleToUser)但是没有被调用可见,只有isVisibleToUser = false
那么,如何为Fragment实现"onPageSelected()"事件呢?
提前致谢
我正在使用ViewPager和FragmentStatePagerAdapter,我希望在片段可见且仅在可见时才在片段中启动动画.问题是当片段是用户当前看到的片段之后的片段时动画开始.我将动画代码从"onActivityCreated"片段函数移动到"onStart"片段函数,甚至移动到"onResume"片段函数,但同样的事情发生了.
基本上我需要等待片段成为用户看到的用于启动某些代码的页面.我怎样才能做到这一点?
提前致谢.
我在FragmentPagerAdapter中有大约20个片段,它们包含一个列表,它从中拾取片段,因此不会重新创建片段.
private List<TitledFragment> fragments;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
this.fragments = new ArrayList<TitledFragment>();
}
@Override
public Fragment getItem(int i) {
return fragments.get(i).getFragment();
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return fragments.get(position).getTitle();
}
public synchronized List<TitledFragment> getFragments() {
return fragments;
}
public synchronized void addFragment(TitledFragment fragment) {
fragments.add(fragment);
notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
FragmentPagerAdapter被设置为ViewPager的适配器,之后我重新排序片段(洗牌仅用于测试)
Collections.shuffle(mSectionsPagerAdapter.getFragments());
mSectionsPagerAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
由于某种原因,只有标题的顺序被改变,即使它为getItem返回不同的片段,因为顺序是不同的.为什么这样,我怎么能绕过它呢?
java android android-fragments android-viewpager fragmentpageradapter