首頁  >  文章  >  Java  >  為什麼我在 Android 中收到「指定的子項目已經有父級」錯誤?

為什麼我在 Android 中收到「指定的子項目已經有父級」錯誤?

DDD
DDD原創
2024-10-30 13:22:02549瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn