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