android - 片段替换显示两个片段
问题描述
我尝试替换主布局中的片段。
在我的主要布局中,我有:
<fragment
android:id="@+id/frame_informations"
android:name="GridFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="2dp"
android:layout_marginEnd="2dp"
app:layout_constraintBottom_toTopOf="@+id/main_bottom_menu"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/llLit"/>
当我想替换这个片段时,我使用:
public void switchFrameInformations(Fragment newFragment) {
try {
FragmentTransaction ft = fm.beginTransaction();
// ft.setCustomAnimations(android.R.anim., android.R.anim.fade_out);
if (fm.findFragmentById(R.id.frame_informations) == null) {
ft.add(R.id.frame_informations, newFragment);
} else {
ft.replace(R.id.frame_informations, newFragment);
}
// ft.addToBackStack(null);
ft.commit();
fm.findFragmentById(R.id.frame_informations).getView().requestLayout();
} catch (Exception e) {
e.printStackTrace();
}
}
fm 是片段管理器...
这可行,但发生了一些奇怪的事情:新片段包含名称列表,背景是透明的。替换结束时,我可以在新片段的背景中看到旧片段......
在调试控制台中,我可以看到所有方法通常都被称为:onDestroy 等......对于旧片段。我猜想 XML 描述中的名称可能会导致问题:
android:name="GridFragment"
但是如果没有名字我就无法编译...
就我认为这是一个常见问题而言,我试图在网上找到解决方案,但我找不到任何解决方案。
感谢您的帮助。
解决方案
在您的活动中替换<fragment
为The添加以下代码<FrameLayout
onCreate
if (savedInstanceState == null) {
fm.beginTransaction()
.replace(R.id.frame_informations, GridFragment())
.commit();
}
这将正确初始化您的片段并允许您在代码中轻松切换片段。
推荐阅读
- nginx - 无法将请求从 nginx 代理到服务器
- swift - 我们可以只得到继续滑块值吗?我想从滑块的最大值中减去用户转发或反向的值
- javascript - 与角度打字稿一起使用时,类型“GlobalEventHandlers”上不存在属性 classList
- spring-boot - 仅从 @RabbitListener 获取特定消息
- sql - 在 sql 中使用 nvarchar 列时如何接受订单
- excel-formula - Excel公式从不同的工作表中获取另一个工作表中的总和
- linux - 如何将目录更改为在 linux 中运行作业(PID)的目录?
- c++ - 有没有一种干净的方法来混合 CRTP 和可变参数继承?
- html - index.html 主页链接已损坏。转到 c:\
- angular-material - 禁用按钮的角材料表