마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AlertDialog 사진 넣기

0 추천
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("동물 선택 대화상자");

        imageView = (ImageView) findViewById(R.id.image_view);

        final Button button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                final String[] versionArray = new String[]{"강아지", "고양이", "말", "토끼"};

                AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
                dlg.setTitle("좋아하는 동물은?");
                dlg.setIcon(R.mipmap.ic_launcher);
                dlg.setItems(versionArray, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }

                }).setPositiveButton("닫기", null);
                dlg.show();
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case 1:
                imageView.setImageResource(R.drawable.dog);
                return true;
            case 2:
                imageView.setImageResource(R.drawable.cat);
                return true;
            case 3:
                imageView.setImageResource(R.drawable.horse);
                return true;
            case 4:
                imageView.setImageResource(R.drawable.rabbit);
                return true;
        }
        return false;
    }
}

이렇게 했는데 오류는 안 나는데 사진이 안떠요..왜그럴까요?
osoks (140 포인트) 님이 2022년 11월 7일 질문

1개의 답변

0 추천

아래 코드가 의심스러워 보여요.

 public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case 1:
                imageView.setImageResource(R.drawable.dog);
                return true;
            case 2:
                imageView.setImageResource(R.drawable.cat);
                return true;
            case 3:
                imageView.setImageResource(R.drawable.horse);
                return true;
            case 4:
                imageView.setImageResource(R.drawable.rabbit);
                return true;
        }
        return false;
    }

item.getItemId()는 옵션메뉴의 ID 인데, 1, 2, 3, 4로 세팅되어 있는게 이상해 보입니다. 브레이크포인트를 찍고 디버깅을 해보시면 더 정확하게 확인하실 수 있을 듯 합니다.

spark (227,530 포인트) 님이 2022년 11월 8일 답변
spark님이 2022년 11월 8일 수정
final String[] versionArray = new String[]{"강아지", "고양이", "말", "토끼"};
이것도 옵션 메뉴로 들어가는건가요??.. 다이얼로그에서 ID는 어떻게 되나요?..어떻게 해야할지 모르겠네요..
옵션메뉴는 Dialog에 속하는 것이 아니라 Activity에 속하는 컴포넌트입니다.
안드로이드에서 옵션 메뉴를 처리하는 방법을 개발자 문서를 통해 먼저 확인하시면 좋을 것 같습니다.
https://developer.android.com/develop/ui/views/components/menus

다이얼로그에 다중, 싱글 선택메뉴를 만들고 싶다면, 아래를 참조하세요.
https://m2.material.io/components/dialogs/android
https://m2.material.io/components/dialogs/android#confirmation-dialog

별도의 id를 정의해서 사용하고 싶으시다면, 아래 링크를 참조하시구요.
https://stackoverflow.com/questions/7621358/what-is-ids-xml-used-for
원하시는게  다이얼그에서 아이템을 선택할 때 이미지가 바뀌게 하려는 건가요? 이 경우에는 Dialog에 콜백을 구현하셔야 해요.

MaterialAlertDialogBuilder(context)
        .setTitle(resources.getString(R.string.title))
        .setPositiveButton(resources.getString(R.string.ok)) { dialog, which ->
            // 버튼 배치에 따라 여기, 아니면
            // which가 선택한 아이템의 인덱스
        }
        // Single-choice items (initialized with checked item)
        .setSingleChoiceItems(singleItems, checkedItem) { dialog, which ->
             // 여기에 코드 작성
             // which가 선택한 아이템의 인덱스  
         }
        .show()

onOptionsItemSelected에 있는 코드가 맞다면 이걸 사용하면 될 것 같아 보이고, 리스트는 인덱스가 0부터 시작하므로 이 부분에 주의하세요.
...