2013-02-27 62 views
0

我有一个自定义视图“ClearableTextView”,在相对布局中有一个EditText和一个按钮。该视图是通过膨胀布局文件创建的,因此这两个视图都有ID。在多个片段中具有相同ID的视图

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

我知道,重复使用相同的ID是不好的,结果是不可预知的,但是一个来自谷歌的人的名字听起来像法国人曾经说过,只要孩子的意见在父母中有独特的ID应该不会有问题找到合适的人。我搜索到的视图甚至没有共同的根视图,它们的视图由不同的碎片拥有。

我寻找的EditText的片段A像这样的参考:

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

而对于的EditText在片段B:

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

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

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

我知道,viewpager结合了每个片段的视图,但在我的情况下,它不应该,因为一直只有一个片段。而且我正在父母身上搜索具有唯一ID的EditText视图。有任何想法吗?

回答

0

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

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

+0

我的自定义视图封装了清理部分。在自定义视图中找到正确的EditText,并按钮清除相应EditText中的文本。我现在发现了一个肮脏的解每当自定义视图膨胀时,我按ID查找EditText,记住refenece,然后随机化id。所以当下一个自定义视图被夸大时,那里不会是另一个具有相同ID的EditText。 – delegate 2013-02-28 07:11:22

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相同的问题,并且此修复也适用。希望这会帮助任何人有这个问题

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()); 
} 
相关问题