在XML布局中使用片段标记时,片段不起作用。但是,将fragment tag替换为Framelayout后,可以正常工作,而无需对我的代码进行任何更改。
当我使用下面的代码时,片段不变/不起作用。
<fragment
android:id="@+id/fragment_container"
android:name="com.example.user.example.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/btnPressMe"
/>
但是,当我用下面的代码替换上面的代码时,它就会更改/起作用。
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/btnPressMe">
</FrameLayout>
Java代码:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment2 fragment2 = new Fragment2();
fragmentTransaction.replace(R.id.fragment_container, fragment2);
fragmentTransaction.commit();
如果要插入另一个片段,则必须使用getChildFragmentManager()而不是getFragmentManager()
FragmentManager fobject = getChildFragmentManager();
FragmentTransaction transaction = fobject .beginTransaction();
fragment_container= fobject .findFragmentById(R.id.fragment_container);
if (fragment_container!= null) {
transaction.replace(R.id.fragment_container, yournewfragment);
transaction.commit();
}
transaction.commit();
将片段静态添加到布局文件
要使用新片段,您可以将其静态添加到XML布局中。在这种情况下,android:name属性指向相应的类,如以下代码段所示。
<fragment
android:id="@+id/listFragment"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
class="com.example.android.rssreader.MyListFragment" ></fragment>
<fragment
android:id="@+id/detailFragment"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent"
class="com.example.android.rssreader.DetailFragment" >
</fragment>
如果您针对不同的设备配置使用不同的静态布局文件,则使用此方案很有意义。
片段中的动态处理
可以通过getFragmentManager()
方法在活动中访问的类,可以在活动布局中添加,删除和替换片段。
必须通过FragmentTransaction
类在事务中执行修改。
要在活动中修改片段,通常在布局文件中定义一个FrameLayout
占位符。
<FrameLayout
android:id="@+id/listcontainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/detailscontainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
您使用FragmentManager将容器替换为片段。
// get fragment manager
FragmentManager fm = getFragmentManager();
// add
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.your_placehodler, new YourFragment());
// alternatively add it with a tag
// trx.add(R.id.your_placehodler, new YourFragment(), "detail");
ft.commit();
// replace
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.your_placehodler, new YourFragment());
ft.commit();
// remove
Fragment fragment = fm.findFragmentById(R.id.your_placehodler);
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment);
ft.commit();
新片段替换了此容器中的现有片段。
如果要将该事务添加到Android的后台,请使用addToBackStack()
方法。这会将动作添加到活动的历史记录堆栈中,即,这将允许通过“后退”按钮还原“片段”更改。