首页 > Java > java教程 > 正文

为什么我在 Android 中收到'指定的子项已经有父级”错误?

DDD
发布: 2024-10-30 13:22:02
原创
562 人浏览过

Why Am I Getting the

排查 Android 错误:“指定的子项已经有父级”

在布局之间频繁切换时,您可能会遇到错误“The指定的子项已经有父项。您必须先在子项的父项上调用removeView() (Android)。”当将视图(例如 TextView 或 EditText)添加到已附加到应用程序内容视图的布局时,就会发生这种情况。

例如,请考虑以下代码,其中频繁创建和切换布局:

<code class="java">private void ConsoleWindow() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // Create a new layout (LinearLayout).
            LinearLayout layout = new LinearLayout(getApplicationContext());
            layout.setOrientation(LinearLayout.VERTICAL);

            // Add a TextView to the layout.
            layout.addView(tv);

            // Add an EditText to the layout.
            et.setHint("Enter Command");
            layout.addView(et);

            // Set the content view to the new layout.
            setContentView(layout);
        }
    });
}</code>
登录后复制

当使用不同的布局调用 setContentView() 方法两次时就会出现问题。第一次没有问题,因为 LinearLayout 布局是第一次添加到内容视图中。但是,在后续调用 setContentView() 期间,LinearLayout 布局仍包含其子级(TextView 和 EditText)。由于 LinearLayout 对象已经有一个父对象(内容视图),再次添加它会抛出“指定的子对象已经有父对象”错误。

解决方案:

解决方案是在再次将其添加到内容视图之前,从 LinearLayout 布局中删除子级(TextView 和 EditText)。以下是修改后的代码:

<code class="java">private void ConsoleWindow() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // Create a new layout (LinearLayout).
            LinearLayout layout = new LinearLayout(getApplicationContext());
            layout.setOrientation(LinearLayout.VERTICAL);

            // Remove the TextView from its parent (if it has one).
            if (tv.getParent() != null) {
                ((ViewGroup) tv.getParent()).removeView(tv);
            }
            
            // Add the TextView to the layout.
            layout.addView(tv);

            // Remove the EditText from its parent (if it has one).
            if (et.getParent() != null) {
                ((ViewGroup) et.getParent()).removeView(et);
            }
            
            // Add the EditText to the layout.
            et.setHint("Enter Command");
            layout.addView(et);

            // Set the content view to the new layout.
            setContentView(layout);
        }
    });
}</code>
登录后复制

通过在将子级添加到新的 LinearLayout 布局之前从其先前的父级中删除子级,可以确保它们不会同时附加到多个父级,从而解决了“指定的子级已有一个父母”错误。

以上是为什么我在 Android 中收到'指定的子项已经有父级”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!