Phân mảnh - Con được chỉ định đã có cha mẹ. Trước tiên, bạn phải gọi removeView () trên cha mẹ của trẻ


80

Tôi nhận được lỗi này. Tôi đã thử nhiều giải pháp nhưng tôi không giải quyết được vấn đề này. Giúp tôi! Tôi cần thêm chế độ xem bề mặt và nút vào hoạt động bằng cách sử dụng các mảnh.

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

}

Lỗi:

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

khi ngoại lệ xảy ra. Khi capturePic nhấp chuột hoặc trước nó.
maddy ngày

Tôi nên gọi getParent ở đâu ?? @maddy trước nó
Vivek

1
đăng activity_camtệp xml của bạn
maddy d

Câu trả lời:


198

Cố gắng thay thế

View v = inflater.inflate(R.layout.camera_fragment, parent);

Với

View v = inflater.inflate(R.layout.camera_fragment, parent, false);

hoặc là

View v = inflater.inflate(R.layout.camera_fragment, null);

10
Cố gắng tránh đi qua null như phụ huynh, sử dụng tùy chọn đầu tiên ông đề cập
Dominic

7
@sudocoder Để trả lời lý do tại sao ?. Parent là chế độ xem gốc của hệ thống phân cấp mà bạn đang thổi phồng tài nguyên để đính kèm, LayoutInflater sẽ tự động cố gắng đính kèm chế độ xem đã thổi phồng vào gốc được cung cấp. Tuy nhiên, khung công tác có một kiểm tra ở chỗ nếu bạn chuyển null cho root, nó sẽ bỏ qua nỗ lực này để tránh ứng dụng của bạn gặp sự cố. Không vượt qua được gì ở đây là nói với khuôn khổ rằng bạn không biết chế độ xem gốc của xml được thổi phồng.
Elltz


Cảm ơn bạn! Bạn đã tiết kiệm thời gian của tôi.
Chia tay

8

Câu hỏi này đã được trả lời nhưng tôi vẫn muốn thêm lý do để thêm false làm tham số thứ ba.

Phương thức Inflate () nhận ba đối số:

  • ID tài nguyên của bố cục bạn muốn tăng.
  • ViewGroup là cha mẹ của bố cục tăng cao. Việc chuyển vùng chứa là rất quan trọng để hệ thống áp dụng các tham số bố cục cho chế độ xem gốc của bố cục được thổi phồng, được chỉ định bởi chế độ xem gốc mà nó đang chạy.
  • Một boolean cho biết liệu bố cục tăng cao có nên được đính kèm vào ViewGroup (tham số thứ hai) trong quá trình lạm phát hay không. (Trong trường hợp này, điều này là sai vì hệ thống đã chèn bố cục tăng cao vào vùng chứa — việc chuyển true sẽ tạo ra một nhóm chế độ xem dư thừa trong bố cục cuối cùng.)

Nguồn: http://developer.android.com/guide/components/fra mảnh.html


7

Trong trường hợp của tôi, tôi đã làm setTransition()trong FragmentTransaction. Mã dưới đây phù hợp với tôi:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {

        if(this::rootView.isInitialized){
            if(rootView.getParent() != null){
                (rootView.getParent() as ViewGroup).endViewTransition(rootView)
            }
            return this.rootView

        }

        ...

}

Điều này có thể xảy ra khi bạn liên tục chuyển đổi giữa các phân đoạn, mà chế độ xem không có thời gian để thực sự tách khỏi phần chính do quá trình chuyển đổi đang diễn ra.


Vâng, tôi có thể xác nhận điều đó. Trong trường hợp cụ thể của tôi, một số phân đoạn của tôi có giao diện người dùng nặng và phức tạp, chẳng hạn như hiển thị Google MapViewvà người dùng có thể thường xuyên điều hướng giữa các phân đoạn đó. Bởi vì mỗi lần tạo lại hoàn toàn chế độ xem của họ rất phức tạp, tôi đang thực hiện bộ nhớ đệm chế độ xem (giữ lại phiên bản của chế độ xem trong Fragment và gửi lại nó vào onCreateView). Nhưng do hoạt ảnh chuyển tiếp giữa 2 phân đoạn như vậy, cả hai chế độ xem cùng tồn tại trong thời gian ngắn và nếu người dùng điều hướng trở lại đủ nhanh, nó sẽ bị lỗi. Vì vậy, gọi điện endViewTransitionlà giải pháp. Cảm ơn rất nhiều và +1 cũng xứng đáng.
Mackovich

Ngoài ra, một lưu ý nhỏ và kỳ lạ thay, vấn đề của tôi hiện chỉ liên quan đến các thiết bị HUAWEI chạy Android 9. Nhưng vấn đề này có thể được tái tạo trên Nexus 5 và các thiết bị không liên quan khác. Tại sao, tôi không biết ... có thể có được một thực hiện vấn đề hoạt hình thích hợp để EMUI OS / Huawei để làm cho nó dễ xảy ra quá thường xuyên?
Mackovich

câu trả lời này là vàng
coolcool1994

5

Tôi đang sử dụng API 26.0.2 và trong trường hợp của tôi, sự cố đã xảy ra do hoạt ảnh tùy chỉnh được đặt cho các phân đoạn của tôi. Nhận xét cuộc gọi để đặt hoạt ảnh tùy chỉnh, đã khắc phục sự cố.

mảnhTransaction.setCustomAnimations (android.R.anim.fade_in, android.R.anim.fade_out);


bó cảm ơn vì đã bình luận điều này. Tôi đã mở liên kết này nhưng bỏ lỡ câu trả lời của bạn. phải mất 3 ngày để gỡ lỗi này. Tôi có thể đã dành nhiều ngày hơn nếu không thấy câu trả lời của bạn.
Qadir Hussain

bạn đã tìm thấy bất kỳ cách nào để làm cho điều này hoạt động với setCustomAnimations.?
Qadir Hussain

@QadirHussain Xin lỗi Hussain, tôi đã không thử.
Satheesh

2

Tôi cũng đã gặp vấn đề này, và đây là giải pháp của tôi. nó rất dễ

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

Hi vọng sẽ hữu ích với bạn


0

Chỉ định Idcho phần tử cha và con, đặc biệt cho các dạng xem tùy chỉnh, trong xmltệp có thể giải quyết vấn đề.


0

Chỉ để bạn tham khảo. Có vẻ như đây là một vấn đề trong Android SDK.

Tôi gặp trường hợp tương tự như @Satheesh với phiên bản SDK: 27.0.2 và việc cố gắng xóa setCustomAnimation có vẻ hoạt động. Nhưng để loại bỏ setCustomAnimations, tôi cần phải thực hiện nhiều thay đổi, tôi muốn giữ lại hoạt ảnh tùy chỉnh. Những gì tôi đã làm là nâng cấp SDK lên phiên bản mới nhất hiện tại là 27.1.1. Và nó hiệu quả với tôi.


0

Có thể hữu ích

           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

Tôi đã điều hướng trong mã của mình và lỗi này được hiển thị khi tôi nhấp vào nút quay lại từ một trong các phân đoạn. Nó được giải quyết khi trong nav_graph, tôi đặt popUpTo trong hành động liên quan . Một số hành động đã được thực hiện nhưng không bật lên bất cứ điều gì.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.