-
[안드로이드] Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.안드로이드(java)/에러 관련 2020. 3. 18. 11:11
Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
alert dialog에 setView(View view) 를 이용해서 커스텀 다이얼로그를 만들고 취소 또는 확인 버튼을 만들어서 처음 한 번은 잘 실행되었는데 두 번째 실행이 되면 위와같은 에러를 내며 앱이 강제 종료 되었습니다.
you must call removeView() 를 보아하니 뭔가 뷰를 제거하라는거 같은데 정확히 어떻게 제거하는지는 잘 모르겠어서 정보를 찾아보았습니다.
view가 등록된 상태에서 또 다시 등록하려고 하는게 문제라고 하네요.
아래는 문제가 발생하던 코드였고 빨간색으로 표시한 부분을 새롭게 추가하여 문제를 추가하였습니다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950public void dialogShow() {final View dialogView = getLayoutInflater().inflate(R.layout.pw_input_dialog, null);AlertDialog.Builder builder = new AlertDialog.Builder(CapNoneActivity.this);builder.setView(dialogView);builder.setTitle("비밀번호 확인");builder.setMessage("비밀번호를 입력해주세요.");builder.setIcon(android.R.drawable.ic_dialog_alert);builder.setPositiveButton("확인", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {EditText inputPw = dialogView.findViewById(R.id.dialogInputPw);String inputPwMsg = inputPw.getText().toString().replace(" ", "");ViewGroup dialogParentView = (ViewGroup) dialogView.getParent();SharedPreferences pref = getSharedPreferences("pw", MODE_PRIVATE);String pw = pref.getString("pw", "");if (pw.equals(inputPwMsg)) {dialog.dismiss();dialogParentView.removeView(dialogView);msgSocket = MsgSocket.getInstance();msgSocket.sendReturn("RESTOCKED");Intent intent = new Intent(CapNoneActivity.this, ManufacturingActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);finish();} else {dialog.dismiss();dialogParentView.removeView(dialogView);inputPw.clearFocus();Toast.makeText(getApplicationContext(), "비밀번호가 일치하지 않습니다. 다시 시도해주세요.", Toast.LENGTH_SHORT).show();}}});builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.setCancelable(true);builder.create();builder.show();}}cs 이런식으로 만들고 removeView(View view); 를 이용하니까 더이상 에러가 나타나지 않고 제대로 작동하게 되었습니다.
'안드로이드(java) > 에러 관련' 카테고리의 다른 글