최근에 안드로이드 앱 개발에 시간을 많이 투자하다보니 에러도 많이 보이네요.
다른분들은 삽질하지 않으시길 바라며 해결방법 포스팅합니다.
개발중에 아래와 같은 에러를 만나시면 아래 해결방법을 사용하세요.
해결방법 : 에러 메시지의 내용을 보면, 컨스트레인셋의 자식 아이템들은 모두 id를 가지고 있어야한다고 합니다.
해결법은 아주 간단합니다. android layout xml 파일을 열어서 id지정이 안된부분에 넣어주면 해결됩니다.
저의 경우는 아래와 같이 activity.xml 파일에서 id를 지정하지 않아서 발생한 에러였습니다.
아래 xml에서 빨간색으로 처리된 id부분을 추가해주면서 이슈가 해결되었습니다.
<FrameLayout
android:id="@+id/framelayout"
android:layout_width="wrap_content"
android:layout_height="55dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
구글에서는 안드로이드 개발하면서 계속해서 error policy 를 적용하여 문제점들을 사전에 해결하려하는듯합니다.
개발자 입장에서는 당장 귀찮을 수 있지만, 실제 릴리즈되는 코드의 상품성을 생각할때는 좋은 정책입니다.
계속해서 업데이트되는 정책이 불편하여 불만스럽지만, Great code, clean code가 되는 중간 과정이라고 생각해보는건 어떨까요? ^^
여기까지 제 개인적인 견해였습니다.
아래는 원본 에러 메시지입니다.
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.picker.puzzleapp, PID: 21439 java.lang.RuntimeException: All children of ConstraintLayout must have ids to use ConstraintSet at androidx.constraintlayout.widget.ConstraintSet.readFallback(ConstraintSet.java:617) at androidx.constraintlayout.motion.widget.MotionScene.readConstraintChain(MotionScene.java:1794) at androidx.constraintlayout.motion.widget.MotionScene.readFallback(MotionScene.java:1747) at androidx.constraintlayout.motion.widget.MotionLayout.onAttachedToWindow(MotionLayout.java:4137) at android.view.View.dispatchAttachedToWindow(View.java:19553) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3430) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2028) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1721) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7598) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966) at android.view.Choreographer.doCallbacks(Choreographer.java:790) at android.view.Choreographer.doFrame(Choreographer.java:725) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) |