web-dev-qa-db-ja.com

フラグメント-指定された子にはすでに親があります。最初に子の親でremoveView()を呼び出す必要があります

このエラーが発生しています。多くの解決策を試しましたが、これを解決することはできません。助けて!フラグメントを使用して、アクティビティにサーフェスビューとボタンを追加する必要があります。

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
69
Vivek

交換してみてください

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);
180
user3390963

この質問は既に回答されていましたが、3番目のパラメーターとしてfalseを追加する理由を追加したいと思います。

Inflate()メソッドは3つの引数を取ります。

  • 展開するレイアウトのリソースID。
  • 膨張したレイアウトの親となるViewGroup。コンテナを渡すことは、システムがレイア​​ウトパラメータを、展開先の親ビューで指定された拡張レイアウトのルートビューに適用するために重要です。
  • 膨張中に膨張したレイアウトをViewGroup(2番目のパラメーター)にアタッチする必要があるかどうかを示すブール値。 (この場合、システムは既に膨張したレイアウトをコンテナに挿入しているため、これはfalseです。trueを渡すと、最終レイアウトに冗長ビューグループが作成されます。)

ソース: http://developer.Android.com/guide/components/fragments.html

8

API 26.0.2を使用していますが、私の場合、フラグメントに設定されたカスタムアニメーションが原因でクラッシュが発生していました。カスタムアニメーションを設定する呼び出しをコメントアウトして、問題を修正しました。

fragmentTransaction.setCustomAnimations(Android.R.anim.fade_in、Android.R.anim.fade_out);

4
Satheesh

私もこの問題に出会い、これが私の解決策です。それは非常に簡単です

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;
}

あなたに役立つことを願っています

1
AnhSang

Idファイルで親要素と子要素、特にカスタムビューにxmlを指定すると問題が解決する場合があります。

ご参考までに。 Android SDKの問題のようです。

@SatheeshがSDKバージョンで持っていたのと同じ状況があります:27.0.2で、setCustomAnimationを削除しようとしてもうまくいくようです。ただし、setCustomAnimationsを削除するには、多くの変更が必要になるため、カスタムアニメーションを保持することをお勧めします。私がしたことは、SDKを現在の27.1.1である最新バージョンにアップグレードすることです。そして、それは私のために働きます。

0

役に立つかもしれません

           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){

            }
0