我有一个使用FragmentTabHost
的活动,因此每个标签中都有一个片段。在第一个标签中,我有2个嵌套片段,一个在屏幕的上半部分,另一个在下半部分。底部的片段使用ViewPager
来扫描多个LinearLayouts
。这一切都很好。
直到您移动到另一个标签,然后返回第一个标签。底部嵌套片段不再出现,但顶部的片段会出现。
以下是一些展示我用法的代码:
这就是我使用我的主要活动的方式:
public class MainActivity extends SherlockFragmentActivity
{
private FragmentTabHost mTabHost;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity_layout_vert);
mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
mTabHost.addTab(mTabHost.newTabSpec("TAB1").setIndicator("", getResources().getDrawable(R.drawable.tab1_selector)), Tab1Fragment.class, null);
mTabHost.addTab(mTabHost.newTabSpec("TAB2").setIndicator("", getResources().getDrawable(R.drawable.tab2_selector)), Tab2Fragment.class, null);
}
}
以下是我如何使用tab1的片段:
public class Tab1Fragment extends SherlockFragment
{
private NestedFragment1 mNestedFrag1 = null;
private NestedFragment2 mNestedFrag2 = null;
@Override
public void onCreate(Bundle inSavedInstanceState)
{
super.onCreate(inSavedInstanceState);
mNestedFrag1 = new NestedFragment1();
mNestedFrag2 = new NestedFragment2();
FragmentManager fragManager = getChildFragmentManager();
FragmentTransaction fragTransaction = fragManager.beginTransaction();
fragTransaction.add(R.id.nested_frag1_container, mNestedFrag1, "Frag1");
fragTransaction.add(R.id.nested_frag2_container, mNestedFrag2, "Frag2");
fragTransaction.commit();
}
@Override
public void onDestroy()
{
FragmentManager fragManager = getChildFragmentManager();
FragmentTransaction fragTransaction = fragManager.beginTransaction();
fragTransaction.remove(mNestedFrag1);
fragTransaction.remove(mNestedFrag2);
fragTransaction.commit();
}
}
以下是我如何使用第二个嵌套片段(消失的片段):
public class NestedFragment2 extends SherlockFragment
{
private MyPageAdapter mPageAdapter;
private ViewPager mViewPager;
@Override
public void onCreate(Bundle inSavedInstanceState)
{
super.onCreate(inSavedInstanceState);
mPageAdapter = new MyPageAdapter();
}
@Override
public void onDestroy()
{
super.onDestroy();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View toReturn = inflater.inflate(R.layout.nested_fragment1_layout_top, container, false);
mViewPager = (ViewPager)toReturn.findViewById(R.id.viewpager);
mViewPager.setAdapter(mPageAdapter);
mViewPager.setOffscreenPageLimit(5);
return toReturn;
}
private class MyPageAdapter extends PagerAdapter
{
@Override
public Object instantiateItem(ViewGroup container, int position)
{
View page = getActivity().getLayoutInflater().inflate(R.layout.view_pager_controls_layout, container, false);
container.addView(page);
return page;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object)
{
container.removeView((View)object);
}
@Override
public int getCount()
{
return 5;
}
@Override
public float getPageWidth(int position)
{
return 1;
}
@Override
public boolean isViewFromObject(View view, Object object)
{
return(view == object);
}
}
}
思想?
答案 0 :(得分:0)
当您移动到其他选项卡时,听起来好像被销毁一样。尝试将ViewPager.setOffscreenPageLimit()
设置为较高的数字并查看它是否仍然存在。
答案 1 :(得分:0)
最有可能的原因是你应该使用childFragmentManager作为嵌套片段,而不是从活动中获得的片段。
从“顶级”片段开始,只要您要执行事务以包含嵌套片段,请使用getChildFragmentManager()
代替getFragmentManager()
答案 2 :(得分:0)
我明白了。上面的代码不是问题。问题与我处理PagerAdapter通胀的方式有关。我没有完全按照上面的说明去做。我实际使用它的方式是防止意见的膨胀发生。