首頁 > 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學習者快速成長!