このエラーが発生しています。多くの解決策を試しましたが、これを解決することはできません。助けて!フラグメントを使用して、アクティビティにサーフェスビューとボタンを追加する必要があります。
CamActivity.Java:
public class CamActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cam);
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
if(fragment == null) {
fragment = new CamFragment();
fm.beginTransaction()
.add(R.id.fragmentContainer, fragment)
.commit();
}
}
}
CamFragment.Java:
public class CamFragment extends Fragment {
private static final String TAG = "CamFragment";
private Camera mCamera;
private SurfaceView mSurfaceView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.camera_fragment, parent);
Button capturePic = (Button)v.findViewById(R.id.img_capture);
capturePic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().finish();
}
});
mSurfaceView = (SurfaceView)v.findViewById(R.id.surfaceView1);
return v;
}
}
エラー:
04-18 13:24:12.735: E/AndroidRuntime(6321): FATAL EXCEPTION: main
04-18 13:24:12.735: E/AndroidRuntime(6321): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pack.camdictionary/com.pack.camdictionary.CamActivity}: Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1728)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1747)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.app.ActivityThread.access$1500(ActivityThread.Java:155)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:993)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.os.Handler.dispatchMessage(Handler.Java:130)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.os.Looper.loop(SourceFile:351)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.app.ActivityThread.main(ActivityThread.Java:3814)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Java.lang.reflect.Method.invokeNative(Native Method)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Java.lang.reflect.Method.invoke(Method.Java:538)
04-18 13:24:12.735: E/AndroidRuntime(6321): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:901)
04-18 13:24:12.735: E/AndroidRuntime(6321): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:659)
04-18 13:24:12.735: E/AndroidRuntime(6321): at dalvik.system.NativeStart.main(Native Method)
04-18 13:24:12.735: E/AndroidRuntime(6321): Caused by: Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.view.ViewGroup.addViewInner(ViewGroup.Java:2007)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.view.ViewGroup.addView(ViewGroup.Java:1902)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.view.ViewGroup.addView(ViewGroup.Java:1859)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.view.ViewGroup.addView(ViewGroup.Java:1839)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.Java:40)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:931)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1104)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:682)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1467)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.support.v4.app.FragmentActivity.onStart(FragmentActivity.Java:570)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.app.Instrumentation.callActivityOnStart(Instrumentation.Java:1166)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.app.Activity.performStart(Activity.Java:3837)
04-18 13:24:12.735: E/AndroidRuntime(6321): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1701)
04-18 13:24:12.735: E/AndroidRuntime(6321): ... 11 more
交換してみてください
View v = inflater.inflate(R.layout.camera_fragment, parent);
と
View v = inflater.inflate(R.layout.camera_fragment, parent, false);
または
View v = inflater.inflate(R.layout.camera_fragment, null);
この質問は既に回答されていましたが、3番目のパラメーターとしてfalseを追加する理由を追加したいと思います。
Inflate()メソッドは3つの引数を取ります。
- 展開するレイアウトのリソースID。
- 膨張したレイアウトの親となるViewGroup。コンテナを渡すことは、システムがレイアウトパラメータを、展開先の親ビューで指定された拡張レイアウトのルートビューに適用するために重要です。
- 膨張中に膨張したレイアウトをViewGroup(2番目のパラメーター)にアタッチする必要があるかどうかを示すブール値。 (この場合、システムは既に膨張したレイアウトをコンテナに挿入しているため、これはfalseです。trueを渡すと、最終レイアウトに冗長ビューグループが作成されます。)
ソース: http://developer.Android.com/guide/components/fragments.html
API 26.0.2を使用していますが、私の場合、フラグメントに設定されたカスタムアニメーションが原因でクラッシュが発生していました。カスタムアニメーションを設定する呼び出しをコメントアウトして、問題を修正しました。
fragmentTransaction.setCustomAnimations(Android.R.anim.fade_in、Android.R.anim.fade_out);
私もこの問題に出会い、これが私の解決策です。それは非常に簡単です
View v;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (v == null) {
v = inflater.inflate(R.layout.camera_fragment, container);
} else {
ViewGroup parent = (ViewGroup) v.getParent();
if (parent != null) {
parent.removeView(v);
}
}
return v;
}
あなたに役立つことを願っています
Id
ファイルで親要素と子要素、特にカスタムビューにxml
を指定すると問題が解決する場合があります。
ご参考までに。 Android SDKの問題のようです。
@SatheeshがSDKバージョンで持っていたのと同じ状況があります:27.0.2で、setCustomAnimationを削除しようとしてもうまくいくようです。ただし、setCustomAnimationsを削除するには、多くの変更が必要になるため、カスタムアニメーションを保持することをお勧めします。私がしたことは、SDKを現在の27.1.1である最新バージョンにアップグレードすることです。そして、それは私のために働きます。
役に立つかもしれません
View customView1;
inflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
customView1= inflater.inflate(R.layout.edit_custom_alert_window, null);
try {
if(customView2.getParent()!=null)
((ViewGroup)customView2.getParent()).removeView(customView2);
}catch (Exception e){
}