ABOUT ME

java, android, dart, flutter, node.js 공부 블로그 입니다.

Today
Yesterday
Total
  • [안드로이드] 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가 등록된 상태에서 또 다시 등록하려고 하는게 문제라고 하네요.

     

    아래는 문제가 발생하던 코드였고 빨간색으로 표시한 부분을 새롭게 추가하여 문제를 추가하였습니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    public 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() {
                @Override
                public 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() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            builder.setCancelable(true);
            builder.create();
            builder.show();
        }
    }
    cs

     

    이런식으로 만들고 removeView(View view); 를 이용하니까 더이상 에러가 나타나지 않고 제대로 작동하게 되었습니다.

     

    댓글

Designed by Tistory.