片段无法使用片段标签,可在帧布局中使用

问题描述 投票:0回答:2

在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();
android android-layout android-fragments android-activity android-framelayout
2个回答
1
投票

如果要插入另一个片段,则必须使用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();

0
投票

将片段静态添加到布局文件

要使用新片段,您可以将其静态添加到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()方法。这会将动作添加到活动的历史记录堆栈中,即,这将允许通过“后退”按钮还原“片段”更改。

© www.soinside.com 2019 - 2024. All rights reserved.