Android で「指定された子にはすでに親がいます」というエラーが表示されるのはなぜですか?

DDD
リリース: 2024-10-30 13:22:02
オリジナル
605 人が閲覧しました

Why Am I Getting the

Android エラーのトラブルシューティング:「指定された子にはすでに親がいます」

レイアウトを頻繁に切り替えると、「指定された子にはすでに親があります。最初に子の親に対して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() メソッドが異なるレイアウトで 2 回呼び出された場合に発生します。初めて 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート