얍얍얍
426
2021-05-04 17:37:18 작성 2021-05-04 17:38:01 수정됨
2
85

안드로이드(자바) 질문입니다. AlertDialog





public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RadioButton radioButton1;

        radioButton1 = findViewById(R.id.rd1);

        Button btn = findViewById(R.id.clickBtn);

        View alertD = View.inflate(MainActivity.this,R.layout.img_box,null);
        ImageView imageView = alertD.findViewById(R.id.imgBox);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder dir = new AlertDialog.Builder(MainActivity.this);
                dir.setTitle("hi");
                dir.setView(alertD);
                dir.setNegativeButton("닫기",null);
                dir.show();
            }
        });

        radioButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imageView.setImageResource(R.mipmap.ic_launcher);
            }
        });

    }
}

문제는 저 진한 코드를 저기다 놓으면

alert창을 닫고 다시 alert창 보기를 클릭할시 에러가 뜨면서 앱이 종료 되더라구요.


에러 내용은 다음과 같습니다.

The specified child already has a parent. You must call removeView() on the child's parent first.


결국 아래와 같은 내용으로 바꿨습니다.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RadioButton radioButton1;

        radioButton1 = findViewById(R.id.rd1);

        Button btn = findViewById(R.id.clickBtn);

        ImageView imageView = alertD.findViewById(R.id.imgBox);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                View alertD = View.inflate(MainActivity.this,R.layout.img_box,null);
                AlertDialog.Builder dir = new AlertDialog.Builder(MainActivity.this);
                dir.setTitle("hi");
                dir.setView(alertD);
                dir.setNegativeButton("닫기",null);
                dir.show();
            }
        });

        radioButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imageView.setImageResource(R.mipmap.ic_launcher);
            }
        });

    }
}

이런식으로 버튼을 클릭했을때 실행되게 안쪽으로 넣어줬습니다.


물론 여러번 alert창을 띄우니 에러는 업더라구요 


문제는 노란색 부분에 ImageView imageView = alertD.findViewById(R.id.imgBox);


이 코드입니다.


imgaeView를 가져오기 위해서는 alertD가 필요한데 저렇게 안쪽에 있으면 어떻게 가져와야할까요....?


애초에 설계부터가 잘못된걸까요 ...;;


일단 저는 imgBox.xml 하나를 만들어서 한곳에서 img만 바뀌게 하고싶었습니다.

0
  • 답변 2

  • yunjae830
    72
    2021-05-04 17:54:15
    View alertD = View.inflate(MainActivity.this,R.layout.img_box,null);

    이 부분을 밖으로 빼면 안되나요? 

    안에 넣든 밖에 넣든 상관 없어 보이는데용? 아닐수도 있어욧

  • 얍얍얍
    426
    2021-05-04 17:57:47

    @yunjae830


    밖으로 빼니까 

    The specified child already has a parent. You must call removeView() on the child's parent first.


    이런 에러가 뜨고 또 앱도 종료됩니다.


    물론 처음 alert창을 띄웠을때는 괜찮은데 두번째는 에러가 뜨네여;;


    왜 뜨는지 저도 궁금하네요.

  • 로그인을 하시면 답변을 등록할 수 있습니다.