私はこの記事を作成しました。これは私が初めてであり、少し助けが必要だからです。私はあなたの名前を付けるアプリケーションについて少し練習をしていますが、「hello(あなたが付けた名前)」を返します。しかし、ボタンを押した後、「指定された子にはすでに親があります。最初に子の親でremoveView()を呼び出す必要があります」というエラーが表示されます。
MainActivity.Java
package com.example.holaamigos;
import Android.os.Bundle;
import Android.app.Activity;
import Android.content.Intent;
import Android.view.*;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.EditText;
public class MainActivity extends Activity {
public final static String EXTRA_SALUDO = "com.example.holaamigos.SALUDO";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText txtNombre = (EditText)findViewById(R.id.TxtNombre);
final Button btnHola = (Button)findViewById(R.id.BtnHola);
btnHola.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ActivitySaludo.class);
String saludo = txtNombre.getText().toString();
intent.putExtra(EXTRA_SALUDO, saludo);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
ActivitySaludo.Java
package com.example.holaamigos;
import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.widget.TextView;
public class ActivitySaludo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_saludo);
Intent intent = getIntent();
String saludo = intent.getStringExtra(MainActivity.EXTRA_SALUDO);
//TextView txt = new TextView(this);
//txt.setText(20);
//txt.setText(saludo);
TextView txtCambiado = (TextView) findViewById(R.id.TxtSaludo);
txtCambiado.setText(saludo);
setContentView(txtCambiado);
}
}
activity_saludo.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical" >
<TextView
Android:id="@+id/TxtSaludo"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="" />
</LinearLayout>
activity_main.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/LinearLayout1"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical" >
<TextView
Android:id="@+id/LblNombre"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/nombre" />
<EditText
Android:id="@+id/TxtNombre"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:inputType="text" />
<Button
Android:id="@+id/BtnHola"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/hola_apy"
Android:onClick="enviarSaludo"/>
</LinearLayout>
LogCat
10-10 16:12:18.470: D/AndroidRuntime(810): Shutting down VM
10-10 16:12:18.470: W/dalvikvm(810): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
10-10 16:12:18.586: E/AndroidRuntime(810): FATAL EXCEPTION: main
10-10 16:12:18.586: E/AndroidRuntime(810): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.holaamigos/com.example.holaamigos.ActivitySaludo}: Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2180)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2230)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.app.ActivityThread.access$600(ActivityThread.Java:141)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1234)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.os.Handler.dispatchMessage(Handler.Java:99)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.os.Looper.loop(Looper.Java:137)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.app.ActivityThread.main(ActivityThread.Java:5041)
10-10 16:12:18.586: E/AndroidRuntime(810): at Java.lang.reflect.Method.invokeNative(Native Method)
10-10 16:12:18.586: E/AndroidRuntime(810): at Java.lang.reflect.Method.invoke(Method.Java:511)
10-10 16:12:18.586: E/AndroidRuntime(810): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:793)
10-10 16:12:18.586: E/AndroidRuntime(810): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:560)
10-10 16:12:18.586: E/AndroidRuntime(810): at dalvik.system.NativeStart.main(Native Method)
10-10 16:12:18.586: E/AndroidRuntime(810): Caused by: Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.view.ViewGroup.addViewInner(ViewGroup.Java:3339)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.view.ViewGroup.addView(ViewGroup.Java:3210)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.view.ViewGroup.addView(ViewGroup.Java:3186)
10-10 16:12:18.586: E/AndroidRuntime(810): at com.Android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.Java:289)
10-10 16:12:18.586: E/AndroidRuntime(810): at com.Android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.Java:279)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.app.Activity.setContentView(Activity.Java:1901)
10-10 16:12:18.586: E/AndroidRuntime(810): at com.example.holaamigos.ActivitySaludo.onCreate(ActivitySaludo.Java:25)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.app.Activity.performCreate(Activity.Java:5104)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1080)
10-10 16:12:18.586: E/AndroidRuntime(810): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2144)
10-10 16:12:18.586: E/AndroidRuntime(810): ... 11 more
10-10 16:12:18.856: D/dalvikvm(810): GC_CONCURRENT freed 134K, 10% free 2630K/2908K, paused 73ms+83ms, total 237ms
onCreateView()
メソッドでフラグメントのビューを拡張しているときにパラメーターを省略すると、次のようにこのエラーが発生しました。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_reject, container);
return view;
}
解決策は、ビューインフレーションラインを次のように変更することです。
View view=inflater.inflate(R.layout.fragment_reject, container,false);
説明は フラグメントのAndroidガイド にあります。
ガイドから引用すると、ビュー初期化ステートメントの最後のパラメーターはfalseです:
「システムは既に膨張したレイアウトをコンテナに挿入しています。trueを渡すと、最終レイアウトに冗長ビューグループが作成されます」
OnCreate with activityまたはonCreateView with fragment
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}
}
try {
view = inflater.inflate(R.layout.fragment_main, container, false);
} catch (InflateException e) {
}
ActivitySaludo
、この行では、
setContentView(txtCambiado);
アクティビティのコンテンツビューを一度だけ設定する必要があります。
次の行は必要ありません:setContentView(txtCambiado);
私の場合、次のようにLayout.onCreateView()
内から誤って子ビューを返していました。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_reject, container, false);
Button button = view.findViewById(R.id.some_button);
return button; // <-- Problem is this
}
解決策は、子ビューではなく親ビューを返すことでした。
私の場合、問題は同じレイアウトを線形レイアウトに複数回追加しようとしていたことでした
View childView = LayoutInflater.from(context).inflate(R.layout.lay_progressheader, parentLayout,false);
for (int i = 1; i <= totalCount; i++) {
parentLayout.addView(childView);
}
問題を修正するために毎回ビューを初期化するだけです
for (int i = 1; i <= totalCount; i++) {
View childView = LayoutInflater.from(context).inflate(R.layout.lay_progressheader, parentLayout,false);
parentLayout.addView(childView);
}
forループで同じビューを繰り返し追加している場合..この場合、forループ内にレイアウトのViewオブジェクトを作成してみてください。そしてforループの内側にビューを追加します
このような問題を回避するには
この方法を試して、これがあなたの問題の解決に役立つことを願っています。
TextView textView = new TextView(this);
textView.setText("CustomTextView");
addContentView(textView,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
OnCreate()メソッドでビューを初期化するだけで、setView()の前にonCreateDialog()で再度初期化するだけで、動作するはずです!
frameLayout.addView(yourView); <-----この行でエラーが発生している場合は、最初に親からビューを削除します
if(yourView.getParent()!= null)
((ViewGroup)yourView.getParent())。removeView(yourView); frameLayout.addView(yourView); (レイアウトにビューを追加)
アクティビティxmlレイアウトに非表示ビューがあるときにこのエラーが発生しました。当時は私のケースでは使用されていなかったため、削除しましたが、クラッシュはもう見られません。