1. ホーム
  2. android

例外「指定された子にはすでに親がいます」の解決方法。removeViewを呼び出す必要があります" の解決方法(ソースコード付き例)

2022-02-17 09:43:57

アンドロイド の開発プロセスでは、時々、異なる状況で同じ問題に遭遇することがあります。

 java.lang.IllegalStateException The specified child already has a parent. You must call removeView() on the child's parent first.

不正な状態例外としても知られており、この特定の がすでにあります。 これに親を追加する必要があります の最初の呼び出しは removeView() メソッドを使用して、コンテンツを継続することができます。ここで明らかになるのは、この 表示 以下は、子 ( 子)。 表示 は親に依存する必要があります ( <スパン 表示 これを利用する場合 子プロセスがある場合は また、単に 次に が関連付けられています。 親子関係から切り離す(つまり リムーバブルビュー <スパン ()) ...... 忘れてしまうか、簡単な例を挙げて説明しましょう。そうすれば、私が混乱したり、あなたがそれを聞いてめまいを起こしたりすることはありません。

新しいプロジェクトを作成し、レイアウトファイルには TextView イメージビュー レイアウトはリニアで(後でソースコードを参照)、結果はテキストと画像になります。

での 活動内容 onCreate() メソッドを使用する場合、通常、次のような方法でレイアウトファイルを使用します。 main.xml .

setContentView(R.layout.main);



ここで、今日説明する例外を説明すると、レイアウトファイルの別の使い方として、上のコードの行をコメントアウトして、次のコードに置き換えることができます。

//Infalterオブジェクトを取得する

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.main, null);
ImageView child = (ImageView)parent.findViewById(R.id.child);        
setContentView(parent);



レイアウトインフレータ は、レイアウトフィラークラスで、分からない人は自分で調べるか、機会があればブログで紹介し、その後 main.xml ファイル名 インフレート について リニアレイアウト ファイルを作成し である。 イメージビュー . 次に setContentView(parent) このレイアウトを設定する main.xml が表示され、これは s etContentView(R.layout.main) このコードも同じ効果を得ることができます。

以下の操作で例外が発生するようになったので、注意してください。

setContentView(child);

つまり、上からsetContentView(parent) で置き換える . 例外として、次のスクリーンショットを参照してください。


そして、この例外の時点で、もう1つの の中で removeView() . ここでは、コマンドに従って、新しいビューを setContentView(child) というフレーズを追加する前に parent.removeView(child) を呼び出すことはありません。 setContentView(child) を呼び出すと、例外は発生しませんが、画像が表示されるだけとなります。 setContentView(親) はテキストコンテンツのみを表示します。 子プロセスの削除 外れている

コードは以下の通りです。