【问题标题】:Fragment Confusion片段混乱
【发布时间】:2016-10-07 12:38:49
【问题描述】:

Android developer documentation for fragments 是这样说的:

"注意:当您通过定义 布局 XML 文件中的片段,您无法在 运行。如果你打算在用户期间交换你的片段 交互时,必须将片段添加到活动中 活动首先开始,如下一课所示。”

部分由于这个原因,我养成了总是使用片段管理器向我的用户界面添加/删除片段的习惯(即使我不想在运行时“热交换”它们)。我 100% 确定,当我尝试在运行时删除/替换“硬连线”XML 片段时,我的应用程序因异常而崩溃。

我已经好几个月没有真正使用过 XML 片段了,但是今天,我玩了一会,发现我能够将 XML 片段换成其他片段,而且……它有效吗?我在网上找不到任何讨论此行为最近变化的内容。它只是工作。

我的布局代码在这里:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fl_frag"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="mobappdev.demo.myapplication.MainActivity">

    <fragment
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:id="@+id/frag"
            android:name="mobappdev.demo.myapplication.BlankFragment"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="@string/click_me"
        android:onClick="clickMe"/>
</LinearLayout>

这里是替换片段的代码:

public void clickMe(View view) {

  FragmentManager manager = getSupportFragmentManager();

  BlankFragment newFrag = BlankFragment.newInstance();
  Fragment oldFrag = manager.findFragmentById(R.id.frag);
  Log.i("TESTING", "old frag is null: " + (oldFrag == null));

  manager.beginTransaction()
    .replace(R.id.fl_frag, newFrag)
    .commit();
}

它没有任何问题。我已经尝试过变体(例如,将 XML 片段放在 FrameLayout 中),一切似乎都很好。我什至尝试了诸如删除/添加之类的变体,然后只是删除,这一切都没有问题。

那么我错过了什么?

【问题讨论】:

  • 也许他们修好了?
  • 嗯,这不是错误,而是一项功能。但即使他们改变了它,当前的文档(上面链接)仍然说它不能完成。
  • 如果是这种情况,可以尝试使用常规的 FragmentManager 而不是支持,看看它是否仍然存在。支持 FragmentManager 毕竟只是系统的一个模拟,所以它必须做不同的事情。
  • 因为这个原因,我已经很多年没有使用 XML 版本了。

标签: java android xml android-fragments layout


【解决方案1】:

您不是替换片段本身,而是在该片段之上添加一个新片段。这只是 ID 的一个小问题,但您要在容器上使用 FragmentManager(LinearLayout)而不是在片段本身上进行替换(R.id.fl_frag 而不是 R.id.frag)

【讨论】:

  • 你是对的。由于几个原因,这并不明显。首先,fragment manager 愉快地“移除”了旧的 Fragment;无法再使用其 ID 找到它(findFragmentById 返回 null),但该片段仍保留在界面中。其次,因为我在旧片段上放置了一个相同的片段,所以我没有注意到它们被覆盖了。通过用一个包含不同文本消息的新片段“替换”旧片段,我能够更好地看到发生了什么。结果更加明显,因为我可以看到两个不同的字符串相互重叠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2012-02-06
相关资源
最近更新 更多