我创建了一个复合控件,我在多个活动中重复使用。该控件包含一堆TextView和Buttons,最重要的是ListView。我在布局文件中定义XML,并在这个复合控件的构造函数中,我这样膨胀XML:
String service = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(service);
inflater.inflate(R.layout.map_menu, this, true);
布局XML包含一个ListView,并且在构造函数中,这个复合控件将处理设置适配器(我的适配器扩展ArrayAdapter)和数组,如下所示:
ListView tableOfContentsList = (ListView) findViewById(R.id.tocListView);
_layerAdapter = new LayerAdapter(context, R.layout.toc_layer_item, _layers);
tableOfContentsList.setAdapter(_layerAdapter);
这种化合物对照用于两种活动 - 其中一种活动称为另一种活动。这两项活动之间没有任何关系。
这是我的问题。在初始活动中创建复合控件时,将调用上面的代码来设置此控件的适配器。然后,当创建并导航到第二个活动时,将在该控件的第二个实例上再次调用构造函数。这似乎对位于初始活动中的第一个控件有副作用。第二个控件似乎从第一个控件覆盖适配器的部分 - 因为一旦调用第二个控件的构造函数,第一个适配器将无法正常工作。
我猜是因为我在两个控件中都引用了ListView的资源ID,所以当创建第二个ListView时,Android会从第一个ListView中删除适配器 - 因为它将两个ListView视为具有相同的资源ID?这可能吗?
我之前在这个完全相同的情况下遇到了麻烦 - 在不同的活动中使用多个复合控件(在单个活动中多次使用) - 问题是由于XML布局的膨胀。我之前的问题的解决方案是摆脱布局的膨胀,而不是通过代码创建对象。这是可以接受的,因为那些复合控件更简单,只包含两个视图 - 但我觉得在上面的ListView案例中,我的复合控件至少有十个视图,在代码中定义每个视图是不可接受的解决方案。我需要布局XML。
在使用从XML中膨胀并在多个实例中重复使用的自定义复合控件时,有没有人遇到过这种冲突行为?
答案 0 :(得分:1)
根据我的理解,Android每次向xml充气时都应该创建一个新的小部件实例。你在复合小部件类中有任何静态成员吗?