0

我想膨胀 ExpandableChildView 组件的 childView。

代码:

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

        View v = convertView;
        LinearLayout linearOpt = themesOptions.get(childPosition);

        if(v == null) {
            v = mInflater.inflate(R.layout.itemrow, null);
        }

        LinearLayout ll = (LinearLayout) v.findViewById(R.id.root);
        ll.addView(linearOpt);
        return v;

    }

其中 linearOpt 是一个向量,其中包含我已实例化的许多 LinearLayout 对象。

    private void prepareThemes(){
        View v = mInflater.inflate(R.layout.widget_configure, null);
        LinearLayout theme = (LinearLayout) v.findViewById(R.id.themeLayout);
        LinearLayout color = (LinearLayout) v.findViewById(R.id.colorLayout);
        LinearLayout trans = (LinearLayout) v.findViewById(R.id.transpLayout);

        themesOptions.add(theme);
        themesOptions.add(color);
        themesOptions.add(trans);

    }

这是 R.layout.itemrow xml:

但我收到了这个错误:

07-18 10:48:49.740: 错误/AndroidRuntime(2738): java.lang.IllegalStateException: 指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。

我该如何解决这个问题?

4

1 回答 1

0

我认为问题是由您准备布局的方式引起的prepareThemes()

你没有提到,但我假设你的'layout/widget_configure.xml'定义了一个这样的结构:?

<LinearLayout android:id="@+id/root">
    <LinearLayout android:id="@+id/themeLayout> <!-- ... --> </LinearLayout>
    <LinearLayout android:id="@+id/colorLayout> <!-- ... --> </LinearLayout>
    <LinearLayout android:id="@+id/transpLayout> <!-- ... --> </LinearLayout>
</LinearLayout>

然后你膨胀它prepareThemes()以获得 3 个子布局。但是此时它们已经注册为周围布局的子级(我称之为“根”)。由于错误意味着一个视图实例只能添加到一个父级

您可以将每个 LinearLayout 存储在其自己的 xml 文件中,然后膨胀 3 次。然后,这些存储的布局可以只添加一次给孩子。

我不确定你想做什么,但我想,最好 - 而不是准备 - 只拥有 3 个不同的布局,其中包括来自的部分layout.itemrow,然后只需制作switch casegetChildView()即时填充所需的布局. 因为即使您在 prepareThemes 中存储了一个未绑定的布局:只要您有一个以上的组,在将预存储的布局添加到 snd 组的子组时,您也会遇到相同的错误。

我希望这有帮助。

于 2010-08-08T23:20:06.587 回答