1

我有一个自定义视图“ClearableTextView”,在相对布局中有一个 EditText 和一个按钮。视图是通过扩展布局文件创建的,因此两个视图具有 ID。

我也有两个片段,每个片段都扩展了它自己的布局。这两种布局都包括我的自定义 ClearableTextView,在其他视图中。

我知道重复使用相同的 ID 是不好的,结果是不可预测的,但是来自谷歌的一个名字听起来很法国的人曾经说过,只要子视图在父视图中具有唯一的 ID,找到正确的 ID 应该没有问题. 我搜索的视图甚至没有共同的根视图,它们所在的视图由不同的 Fragment 拥有。

我在片段 A 中查找 EditText 的引用,如下所示:

v= inflater.inflate(layoutA);
TextView tvA=v.findViewById("someLayoutUniqueID").findById(ClearableTextView_uniqueID_A).findViewById(editTextID);

对于片段 B 中的 EditText:

v= inflater.inflate(layoutB);
TextView tvA=v.findViewById("anotherLayoutUniqueId").findById(ClearableTextView_uniqueID_B).findViewById(editTextID);

当我说一个 ID 是唯一的时,这意味着它在我项目的所有布局中都是唯一的。

现在奇怪的东西:我创建了 Fragment A。我不知道它是否重要,但 Fragment 使用 FragmentStatePagerAdapter 附加到 viewPager。我在 EditText 中输入了一些内容。然后我按下一个按钮来创建 Fragment B,从 viewPager 中删除 A,并将 Fragment B 附加到 viewPager。现在在片段 B 中,EditText 包含来自片段 A 的文本!!!为什么?

我知道 viewpager 结合了每个片段的视图,但在我的情况下它不应该,因为始终只附加一个片段。我正在他们的父母中搜索具有唯一 ID 的 EditText 视图。有任何想法吗?

4

3 回答 3

1

如果我没记错的话,ViewPager通常会将任何相邻的片段保留在内存中,以便提高滑动性能。它还保留片段的状态,以便可以快速重新加载,其中包括视图的值。当您将片段添加到视图寻呼机时,它将导致您的片段被加载并附加到活动的视图树。

我过去遇到过类似的问题,我一直把我的文本放到错误的TextView. 我从来没有像你那样尝试过嵌套findById调用,但是当我简单地搜索一个TextViewby id 时,我通常会得到第一个声明的那个。您可以通过两种方式解决此问题,第一种是使用不同的 id,这将需要一些剪切和粘贴操作(在一定程度上可以管理)。第二个也是最佳选择是创建一个自定义视图来封装这个布局和它的逻辑。预定义单击按钮以清除文本并创建一个界面以公开 que 所需/必要的位,以便它与您的其余代码一起正常运行。

于 2013-02-27T19:36:09.173 回答
1

我知道这已经晚了,但我一直遇到同样的问题,我想我找到了一个简单的解决方案。除了通过 ID 查找 EditText 之外,您还可以获取该 EditText 的父级,然后查找作为 EditText 的子级,如下所示:

LinearLayout layout = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.layout_with_editText);
EditText et = (EditText) layout.getChildAt(index); //whatever index your EditText is at

这实际上将允许您在相关的 EditText 上分配文本或执行任何工作,而不是在内存中使用相同的 id。我对 Spinners 也有同样的问题,这个修复也适用。希望这会帮助任何人解决这个问题

于 2013-07-29T16:04:35.677 回答
1

我有 ViewPager 和一些带有父 RelativeLayout 的 MyFragment.newInstance(uniqueId)。创建后,我尝试将任何视图动态添加到第一页的任何其他视图,所有新视图都添加到第一页。最后,我帮助为 onViewCreated 中的每个 RelativeLayout 设置 uniqueId。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    vBackground.setId(mPresenter.getVehicle().getId());
}
于 2017-02-22T04:26:36.313 回答