【问题标题】:Fragment doesn't work using fragment tag, works in framelayout片段不能使用片段标签工作,在框架布局中工作
【发布时间】:2015-12-16 05:24:58
【问题描述】:

在 XML 布局中使用片段标记时,片段不起作用。但是,将片段标记替换为 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();

【问题讨论】:

  • 两者都有相同的 ID .... ??
  • 我一次评论一个,这只是为了显示代码。
  • 对同一种标签使用不同的 id...
  • Koutuk,正如我所说,当我使用框架布局时,我会删除片段。我只是显示上面的代码。请不要混淆。

标签: android android-layout android-fragments android-activity android-framelayout


【解决方案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();

【讨论】:

  • 我用的是Api 23,没有getChildFragmentManager()这样的功能
【解决方案2】:

静态添加片段到布局文件

要使用您的新片段,您可以将其静态添加到 XML 布局中。在这种情况下,android:name 属性指向相应的类,如以下代码 sn-p 所示。

<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 类在事务中执行修改。

要修改 Activity 中的片段,您通常在布局文件中定义 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 的 backstack,请使用 addToBackStack() 方法。这会将动作添加到活动的历史堆栈中,即,这将允许通过后退按钮恢复片段更改。

【讨论】:

  • Rubin,我只希望我的活动中的一个片段/部分可以替换为不同的片段布局。而且,我使用 XML 中的单个框架布局实现了这一点,但是,问题是为什么当我使用片段而不是框架布局时它不起作用?
  • 您能否更新您的整个 xml 代码和 logcat 错误。也许你有任何重复的 ID
  • 我已经更新了这个问题,它说当我使用片段时它不起作用,但是当我使用框架布局而不是片段时它起作用。我不我们俩在一起。而且,我没有收到任何错误,代码运行良好,但片段没有改变。
  • 如果您想更改/替换片段,请使用@RubinNellikunnathu 建议的动态方式
猜你喜欢
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多