개발자
안드로이드 스튜디오를 이용해서 축구 소셜 매치 어플을 제작하고 있습니다 AlertDialog에서 매치 참가 확정을 누르면 첫번째는 정상 실행되지만 다시한번 참가확정을 누르게되면 어플이 강제 종료가 되는데 원인을 모르겠습니다
1package com.example.project;
2
3import android.app.AlertDialog;
4import android.app.Dialog;
5import android.content.Context;
6import android.content.DialogInterface;
7import android.view.LayoutInflater;
8import android.view.View;
9import android.view.ViewGroup;
10import android.widget.AdapterView;
11import android.widget.BaseAdapter;
12import android.widget.Button;
13import android.widget.ListView;
14import android.widget.TextView;
15import android.widget.Toast;
16
17import androidx.recyclerview.widget.RecyclerView;
18
19import com.google.android.material.floatingactionbutton.FloatingActionButton;
20import com.google.firebase.database.FirebaseDatabase;
21
22import org.w3c.dom.Text;
23
24import java.util.ArrayList;
25
26import javax.crypto.Mac;
27public class HomeListItem extends BaseAdapter {
28
29 ArrayList<HomeList> homelist=new ArrayList<>();
30 @Override
31 public int getCount() {
32 return homelist.size();
33 }
34
35 @Override
36 public Object getItem(int position) {
37 return homelist.get(position);
38 }
39
40 @Override
41 public long getItemId(int position) {
42 return position;
43 }
44
45 @Override
46 public View getView(int position, View convertView, ViewGroup parent) {
47 Context c= parent.getContext();
48 View dialogView=View.inflate(c,R.layout.match,null);
49 AlertDialog.Builder dlg=new AlertDialog.Builder(c);
50 dlg.setTitle("매치 참가 확인");
51 dlg.setView(dialogView);
52 dlg.setNegativeButton("닫기",null);
53 dlg.setPositiveButton("확정", new DialogInterface.OnClickListener() {
54 @Override
55 public void onClick(DialogInterface dialog, int which) {
56 Toast.makeText(c.getApplicationContext(),"매치 참가 확정되었습니다",Toast.LENGTH_LONG).show();
57 }
58 });
59 if (convertView==null){
60 LayoutInflater li= (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
61 convertView=li.inflate(R.layout.homecutom,parent,false);
62 }
63 Button homebtn1=(Button)convertView.findViewById(R.id.homebtn1);
64 TextView homecustom1=convertView.findViewById(R.id.homecustom1);
65 TextView homecustom2=convertView.findViewById(R.id.homecustom2);
66 TextView homecustom3=convertView.findViewById(R.id.homecustom3);
67 HomeList hl=homelist.get(position);
68 homecustom3.setText(hl.getDay());
69 homecustom1.setText(hl.getName());
70 homecustom2.setText(hl.getTime());
71 homecustom1.setOnClickListener(new View.OnClickListener() {
72 @Override
73 public void onClick(View v) {
74 dlg.show();
75 }
76 });
77 homecustom2.setOnClickListener(new View.OnClickListener() {
78 @Override
79 public void onClick(View v) {
80 dlg.show();
81 }
82 });
83 homebtn1.setOnClickListener(new View.OnClickListener() {
84 @Override
85 public void onClick(View v) {
86 dlg.show();
87 }
88 });
89 return convertView;
90 }
91 public void addHomeList(String name, String day,String time){
92 HomeList hl=new HomeList();
93
94 hl.setName(name);
95 hl.setDay(day);
96 hl.setTime(time);
97
98 homelist.add(hl);
99 }
100}
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2023년 11월 21일
안드로이드 스튜디오에서 강제 종료 오류는 다양한 이유로 발생할 수 있습니다. 그러나 질문에서 말씀하신 환경과 소스 코드를 바탕으로 보면, 일단 가장 현저하게 보이는 문제점은 'AlertDialog'가 서로 달라도 같은 참조를 가리키고 있기 때문입니다. 리스트의 각 아이템에 대해, `getView()` 메소드내에서 동일한 'AlertDialog'인 'dlg'를 사용하게 되므로, 여러 아이템에서 동시에 같은 대화상자를 호출하는 경우 충돌이 발생하여 앱이 강제 종료될 수 있습니다. 충돌을 막기 위해서는 리스트 뷰의 각 아이템마다 새로운 AlertDialog 인스턴스가 생성되어야 합니다. `getView()` 메소드 내부에서 확인 버튼을 클릭했을 때 다이얼로그를 표시하는 부분을 함수로 추출하고, 이 함수가 매번 새로운 AlertDialog 인스턴스를 리턴하도록 변경해보세요. 또한, 문제의 원인을 정확히 파악하기 위해서는 앱이 강제 종료되었을 때 발생하는 로그 메시지(특히 'Fatal Exception' 및 'at' 뒤에 나오는 부분)를 확인해보는 것이 중요합니다. 안드로이드 스튜디오의 Logcat 창에서 해당 로그를 볼 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!