我创建了一个复合控件,可在多个活动中重复使用。这个控件包含一堆 TextView 和 Button,最重要的是一个 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,Android 会在创建第二个 ListView 时从第一个 ListView 中删除适配器 - 因为它认为两个 ListView 具有相同的资源 ID?这可能吗?
在这种完全相同的情况下,我之前遇到过麻烦——在不同的活动中使用了多个复合控件(并且在单个活动中使用了多次)——问题是由于 XML 布局的膨胀。我对先前问题的解决方案是摆脱布局中的膨胀,而是通过代码创建对象。这是可以接受的,因为那些复合控件要简单得多,并且只包含两个视图 - 但是我觉得在上面的 ListView 案例中,我的复合控件中至少有十个视图,在代码中定义每个视图不是一个可接受的解决方案。我需要布局 XML。
在使用从 XML 扩展并在多个实例中重复使用的自定义复合控件时,有没有人经历过这种冲突行为?