Articles of android nested fragment

getParentFragment返回null

我有一个具有FrameLayout的Fragment 。 该第一个片段(A)在其Framelayout内加载另一个片段(B)。 当我从内部片段(B)调用getParentFragment ,我得到null 。 该方法应该如何正确使用?

无法保存和恢复嵌套的片段?

我有一个嵌套的片段,我试图恢复状态给定方向的变化。 所以首先我的设置如下: Activity -> ParentFragment (SetRetainInstance(true)) -> ChildFragment 在我的孩子片段我有onSaveInstance代码如下: @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Serialize the current dropdown position. outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActivity().getActionBar() .getSelectedNavigationIndex()); } 但是,当我在所有LifeCycle事件中定位设备时,都会返回null的savedInstance状态。 我正在做一个ChildFragment不正确吗? 为什么我的状态没有得到保存和返回?

使用嵌套的片段和animation对象

我有片段A,其中包含两个片段,片段B和片段C.我想使用getChildFragmentManager()将片段B添加到片段A,然后使用此代码通过卡片翻转animationreplace片段C getChildFragmentManager() .beginTransaction() .setCustomAnimations( R.animator.card_flip_right_in, R.animator.card_flip_right_out, R.animator.card_flip_left_in, R.animator.card_flip_left_out) .replace(R.id.fragment_new_word_container, new FragmentCardBack()) .addToBackStack(null) .commit(); 在Android 4.2中引入的嵌套片段在早期版本中使用它,我们可以使用支持库。 一切都很好。 问题是支持库中的FragmentManager不支持对象animation。 所以它似乎我只有2个选项: 目标api级别4.2和更高,这将花费我超过一半的我的客户。 这不适合我! 不使用嵌套的片段,因为animation是我的应用程序的重要组成部分。 那么有什么其他的方式,我可以使用支持库嵌套片段与翻转卡animation?

在哪里调用getChildFragmentManager()?

问题 根据Google的文档: 您现在可以将碎片embedded到碎片中。 这对于您想要将dynamic和可重用UI组件放入本身为dynamic且可重用的UI组件的各种情况很有用。 例如,如果使用ViewPager创build左右滑动并占用大部分屏幕空间的片段,则现在可以将片段插入到每个片段页面中。 要嵌套一个片段,只需在要添加片段的片段上调用getChildFragmentManager()即可。 这将返回一个FragmentManager,您可以像使用顶级活动一样使用FragmentManager来创build片段事务。 例如,下面是一些在现有的Fragment类中添加片段的代码: Fragment videoFragment = new VideoPlayerFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.video_fragment, videoFragment).commit(); 所以我有(例如) TestFragment ,看起来像: public class TestFragment extends Fragment { private View mFragmentView; private FrameLayout mFrameLayout; public HistoryFragment() { super(); } @Override public View onCreateView(LayoutInflater pInflater, ViewGroup pViewGroup, Bundle pBundle) { mFragmentView = pInflater.inflate(R.layout.fragment_layout, pViewGroup, false); mFrameLayout […]

Fragment里面的FragmentPagerAdapter

我在实现基于多个ViewPagers的devise时遇到了一些麻烦。 在高层次上,我有一个FrameLayout的FragmentActivity,因为它的内容。 我有3个不同的片段,我想要显示。 所有3个全屏幕,一次只能使用1个。 片段1是一些基本的片段与一些TextViews和ImageViews。 片段2有一个ViewPager和一个FragmentPagerAdapter,为它提供几个简单的片段。 片段3有一个ViewPager和一个FragmentPagerAdapter,为它提供几个简单的片段(与片段2不同) 在我的FragmentActivity onCreate()我得到的FragmentManager和开始一个事务,以取代我的FrameLayout中的一个新的片段2实例。 在这一点上,一切都按预期工作。 我的ViewPager在片段2完美地工作。 现在我有一个菜单选项,用Fragment 3的新实例replace我的FrameLayout中的Fragment 2。 当我尝试用另一个replace事务将Fragment 2放回到FrameLayout中时,问题就出现了。 我看到我的PagerIndicater在顶部,但我的网页是空白的。 我试着创build一个新的我的Fragment 2的实例,并调用一个replace事务。 当我调用replace和在replace之前添加findFragmentByTag检查而不是创build新实例时,我也尝试在我的碎片上设置一个标记。 在我第二次replace之后,两者都给了我相同的空白页的结果。 供参考我的第一个devise只是一个ViewPager和ViewIndicater的FragmentActivity。 我只有我的描述上面的片段2和片段3和一个菜单选项来切换它们。 要切换我有2个不同的FragmentPagerAdapters定义,只是称为ViewPager.setAdapter设置选定的FragmentPagerAdapter。 这是完美的工作,但现在我需要一个新的顶级片段,根本不使用ViewPager。 这就是为什么我决定把我的ViewPage移动到他们自己的片段中。 我的想法是,我只是交换我的片段到FrameLayout。 我现在没有我的代码在我面前,所以我不能发布任何,但我会明天添加一些代码到我的问题,以帮助促进答案。

具有相同类的多个片段实例的ViewPager

我正在尝试创build一个包含5个片段的ViewPager。 5个片段“容器”,所以他们每个都包含2个片段。 4个第一个片段具有相同的布局,属于同一个类别。 第五个来自另一个class级,这个没有问题。 问题是,当活动启动时,只有1个片段似乎正在工作(viewPager中位置0的一个)。 我尝试在我的PagerAdapter中的位置0处返回新的Fragment(),但是当我这样做的时候,它是正在工作的第二个片段。 (通过工作,我的意思是显示在左边的列表,我仍然没有照顾右边的细节片段) 这是一些代码 CustomPagerAdapter.java public class CustomPagerAdapter extends FragmentPagerAdapter{ public CustomPagerAdapter(FragmentManager fm) { super(fm); } public CustomPagerAdapter(FragmentManager fm, Context context) { super(fm); } @Override public Fragment getItem(int pos) { if(pos == 4) return new OtherContainerFragment(); else return new ContainerFragment(pos); } @Override public int getCount() { return 5; } ContainerFragment.java public […]

FragmentManager popBackStack不会删除片段

我正在使用Fragments实现菜单导航。 所以我从Home开始,然后用户可以导航到每个部分的不同部分和细节。 当用户更改部分时,我在fragmentmanager的backstack上调用pop,直到到达Home,然后加载新的部分。 这一切都按预期工作。 但是我得到这个问题: 加载一个调用onResume()的setHasOptionsMenu(true) 加载另一个部分(老的部分,它被放置在堆栈之外)。 我明白了。 没有菜单显示 离开应用程序(例如,去Android Laucher活动),然后当我回来时,我看到正确的部分,但它显示旧的片段的菜单。 我已经迭代了后台并打印每个片段,而不是菜单的片段。 我在onResume()方法( setHasOptionsMenu(true)被标记的地方)上放了一个debugging标记,它确实进入了这里,所以碎片仍然在某处。 我想知道如果我做错了什么,我怎么能解决它,thx 更新: 我正在使用此代码来加载新的片段 fm.beginTransaction() .add(container, sectionFragment.getFragment()) .addToBackStack(sectionFragment.getFragmentName()) .commit(); 而为了删除: private void clearStack(){ int count = fm.getBackStackEntryCount(); while(count > 1){ fm.popBackStack(); count–; } } 注1:我使用添加替代,因为我不想松散我的片段状态,当我从细节部分导航回来。 当我加载另一个不同的部分,然后我调用clearStackpopup堆栈高达1,然后加载新的片段。 最后,我调用executePendingTransactions()完成从事务中删除碎片。 注2:我看到它正在我的片段onDestroy()方法进入,所以它被认为是被销毁。 但是我不知道为什么在主要活动恢复时再次调用它。

支持库v13中的getChildFragmentManager在哪里?

Android支持库v13应该为来自Android 3.1的更新的API提供支持。 但是,据我所知,不支持儿童碎片。 具体来说,getChildFragmentManager()在哪里? v13支持库依赖于本地片段,直到API级别17才添加此方法。我有一个最低SDK级别14的应用程序,所以我应该能够使用v13支持库,但似乎我不能。 我不想一直回到v4支持库,并承担所有的重量。 v13库是完美的,否则。

如何创build包含片段的Android选项卡式对话框?

任何人都可以指向我的例子,或告诉我如何在Android中创build一个简单的Tabbed Dialog ,其中每个选项卡的内容是Fragments ? 我find的所有示例/教程都是关于片段和制表符的,但没有特定于DialogFragments 。 FragmentTabHost的文档展示了如何使用getChildFragmentManager()在普通片段中创build制表符。 我假设这应该也工作时,片段是一个DialogFragment但是当我尝试它,我得到: java.lang.IllegalStateException: Fragment does not have a view at android.support.v4.app.Fragment$1.findViewById(Fragment.java:1425) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:901) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) … 这是我的代码设置视图(然后传递给AlertDialog.setView() ): private void setupView(View v) { mTabHost = (FragmentTabHost) v.findViewById(android.R.id.tabhost); mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent); mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("Tab1"), MyDialogFragment.class, null); }

将一个片段添加到对话框中

我想添加一个片段到对话框(它可以是一个DialogFragment或一个普通的对话框)。 我怎么做? 这是我的DialogFragment: public class MyDialogFragment extends DialogFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { MyDialogFragment2 dialog = new MyDialogFragment2(); View v = inflater.inflate(R.layout.news_articles, container, false); getActivity().getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, dialog).commit(); return v; } } 这里是news_article.xml: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> 这是我的主要活动: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override […]