Ale*_*tov 6 android nested android-fragments android-viewpager fragmentpageradapter
根据谷歌的文档:
您现在可以将片段嵌入片段中.这对于您希望将动态和可重用UI组件放入自身动态且可重用的UI组件的各种情况都很有用.例如,如果使用ViewPager创建 向左和向右滑动并占用大部分屏幕空间的 片段,则现在可以将片段插入到每个片段页面中.要嵌套片段,只需在要添加片段的片段上调用getChildFragmentManager().这将返回一个FragmentManager,您可以像通常从顶级活动那样使用它来创建片段事务.例如,这里有一些代码可以在现有的Fragment类中添加一个片段:
Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();
Run Code Online (Sandbox Code Playgroud)
所以我创造了自己的PageFragment
.而我PageFragmentAdapter
的3页PageFragment
.我还有6个片段:Fragment1
,Fragment2
,Fragment3
,FragmentA
,FragmentB
,FragmentC
.在我的MainActivity
初始化我的六个片段,我ViewPager
和它PageFragmentAdapter
(它PageFragment
自己初始化三个).
然后,我用这个方法来附上我的Fragment1
,Fragment2
,Fragment3
每个页面(每个PageFragment
的)PageFragmentAdapter
:
PageFragmentAdapter tPageFragmentAdapter = new PageFragmentAdapter(getSupportFragmentManager());
tPageFragmentAdapter.setFirstPage(tFragment1);
tPageFragmentAdapter.setSecondPage(tFragment2);
tPageFragmentAdapter.setThirdPage(tFragment3);
Run Code Online (Sandbox Code Playgroud)
我可以回复(通过方法PageFragmentAdapter
)片段并将"嵌套片段"放入我的PageFragment
(当然onCreate()
)中,如:
getChildFragmentManager().beginTransaction()
.add(R.id.framelayout_history, mFragment)
.addToBackStack(null)
.commit();
Run Code Online (Sandbox Code Playgroud)
注意:我用它PageFragment.setNestedFragment()
来设置mFragment
它.
而且效果很棒!它将帮助我(但这个故事不是关于它)简单地替换ViewPager中的片段,如:
tPageFragmentAdapter.replaceFirstPage(tFragmentA);
Run Code Online (Sandbox Code Playgroud)
但我有一个很大的问题.再次谷歌的文档:
PagerAdapter的实现,将每个页面表示为片段,只要用户可以返回到页面,该片段就会持久保存在片段管理器中.此版本的寻呼机最适合在有少量通常更多静态片段进行分页时使用,例如一组选项卡.用户 访问 的每个页面的片段将保留在内存中,但其视图层次结构可能在不可见时被销毁.这可能导致使用大量内存,因为片段实例可以保持任意数量的状态.
你可以看到PageFragmentAdapter
可以摧毁我的每一个PageFragment
,当然还有它的嵌套片段.当它将被重新创建时,它将具有NULL而不是mFragment
值.我试图通过getChildFragmentManager().putFragment()
它保存它然后得到它getChildFragmentManager().getFragment()
.但它不起作用.
所以我的问题是:如何将我的嵌套片段保存在我的父片段中?可能吗?
我非常感谢你的帮助.亚历克斯.PS真的很抱歉我的英文:)
Thx @AndroidBegin.com的答案!
这似乎是新添加的嵌套片段支持中的一个错误.基本上,子FragmentManager在与活动分离时最终会出现内部状态损坏.为我修复它的一个短期解决方法是将以下内容添加到您调用getChildFragmentManager()的每个Fragment的onDetach():
@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 11
在你的片段上尝试这个.
public class Fragment2 extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.viewpager_main, container, false);
// Locate the ViewPager in viewpager_main.xml
ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager);
// Set the ViewPagerAdapter into ViewPager
mViewPager.setAdapter(new ViewPagerAdapter(getChildFragmentManager()));
return view;
}
@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class
.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
资料来源:http://www.androidbegin.com/tutorial/actionbarsherlock-side-menu-navigation-nested-viewpager-fragment-tabs-tutorial/
归档时间: |
|
查看次数: |
12982 次 |
最近记录: |