我有问题使我的片段通过Activity使用FragmentPagerAdapter,作为帮助类来实现对标签的管理以及连接ViewPager关联的所有细节TabHost.我的实现FragmentPagerAdapter与Android示例项目Support4Demos提供的一样.
主要问题是FragmentManager当我没有Id或Tag时,如何从特定片段中获取特定片段?FragmentPagerAdapter正在创建片段并自动生成Id和标签.
我有以下问题:我有一个活动,其中我有两个选项卡,使用FragmentPagerAdapter作为片段 在某些时刻我想更改其中一个片段的视图,但我无法找到FragmentById()或findFragmentByTag( )我无法设置id,因为我没有在XML中声明Fragment,因为FragmentPagerAdapter 当我尝试设置标记时,我遇到了以下问题:
08-15 21:46:23.805: E/AndroidRuntime(9297): java.lang.IllegalStateException: Can't change tag of fragment Companies{416d7b78 id=0x7f04002e companies}: was companies now android:switcher:2130968622:1
Run Code Online (Sandbox Code Playgroud)
我的寻呼机FragmentPagerAdapter的代码:
public class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final FragmentActivity mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = …Run Code Online (Sandbox Code Playgroud) 我不熟悉FragmentPagerAdapter,所以这将成为我们(你)批判性地阅读描述的问题之一.
结构:我有一个FragmentPagerAdapter(下面的代码),一次可以容纳两个片段.第一个显示书籍摘录,第二个显示书名列表.
目标:我想实现标题中描述的内容:用户可以导航到寻呼机中的第二个片段,单击标题,然后我想将用户移回第一个片段并告诉第一个片段更新文本.第一个片段有一个triggerRefresh方法.
代码:我相信我的问题发生是因为FragmentPagerAdapter重用/创建片段的方式(我不明白).这是我的班级:
static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new ExcerptsFragment();
case 1:
return new BookListFragment();
default:
throw new IllegalArgumentException("not this many fragments: " + position);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我创建相关成员的方式:
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
Run Code Online (Sandbox Code Playgroud)
这就是我在我的活动中尝试过的其他内容,当我收到书名为Fragment并选择了标题的回调时:
mViewPager.setCurrentItem(0); …Run Code Online (Sandbox Code Playgroud) android updating android-fragments android-viewpager fragmentpageradapter
编辑:我发现Activity正在保存实例,但Fragments保存的数据并没有使它保存到Activity savedInstanceState.我将当前时间保存在outState中,但它没有一路向上,因为活动在其SavedInstanceState中没有任何内容,并且如果我将其打印到logcat,则返回'null'. ..
我正在构建一个内置了countup和countdown计时器的应用程序.计时器的基本托管活动是FragmentActivity,它托管一个FragementPagerAdapter,它在代码中膨胀两个片段(我没有给XML中的片段提供id因为它们没有被定义为.xml中的片段.一切都很有效,直到方向改变,然后活动看起来像是失去了与旧片段的联系,只是选择创建新的片段.这意味着任何当前倒计时都会丢失,并且在配置更改时也会丢失所选择的任何时间.我需要保持计数(如果它开始)和当前显示的任何数字....
我知道适配器应该自己处理这些事情,我在OnCreate和OnCreateView中都设置了SetRetainInstance(true).
我把碎片放入Fragment代码,让我知道每当saveInstanceState为非null时,至少我知道发生了什么,但似乎实例总是为NULL,并且它从头开始创建...总是.
其他一些解决方案让我重写了instantiateItem,但似乎它仅用于重置回调,其他人更改Manifest中的设置(不赞成)....其他解决方案对我来说就像我有事情设置正确..但很明显,我在路上搞砸了一些东西.我只是为FragmentActivity,FragementPagerAdapter和一些片段代码提供代码,因为我不想使用可能不是问题的代码来垃圾邮件.
FragmentActivity
public class Timer_Main extends FragmentActivity {
ViewPager pager;
Timer_Pager mAdapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.timer_pager);
mAdapter = new Timer_Pager(this, getSupportFragmentManager());
pager = (ViewPager) findViewById(R.id.timer_pager_display);
pager.setAdapter(mAdapter);
}
public static String getTitle(Context ctxt, int position) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("pageItem", pager.getCurrentItem());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
}
Run Code Online (Sandbox Code Playgroud)
FragementPagerAdapter
public class Timer_Pager extends FragmentPagerAdapter{
Context ctxt = …Run Code Online (Sandbox Code Playgroud) android android-fragments android-fragmentactivity android-pageradapter