多个片段中具有相同ID的视图

时间:2013-02-27 18:45:54

标签: java android android-viewpager

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

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

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

我在片段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是唯一的时,它意味着它在我项目的所有布局中都是唯一的。

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

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我知道这已经晚了,但我遇到了同样的问题,我想我找到了一个简单的解决方案。您不仅可以通过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相同的问题,这个修复也适用。希望这可以帮助任何有这个问题的人

答案 2 :(得分:0)

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

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    vBackground.setId(mPresenter.getVehicle().getId());
}
相关问题