개발자

안드로이드 스튜디오 오류 어디가 문제일까요?

2023년 11월 21일조회 61

안드로이드 스튜디오를 이용해서 축구 소셜 매치 어플을 제작하고 있습니다 오류. AlertDialog를 이용하여 매치를 생성하려고 하는데요 장소, 날짜, 시간을 설정하고 생성을 누르면 리스트뷰에 등록되지 않고 어플이 강제 종료됩니다.

1package com.example.project;
2
3import static android.R.layout.*;
4import static android.widget.Toast.makeText;
5
6import static com.example.project.R.id.homebtn1;
7import static com.example.project.R.id.mTitle;
8import static com.example.project.R.layout.makematch;
9import static com.example.project.R.layout.match;
10
11import android.app.Activity;
12import android.app.AlertDialog;
13import android.content.Context;
14import android.content.DialogInterface;
15import android.content.Intent;
16import android.os.Bundle;
17
18import androidx.annotation.NonNull;
19import androidx.fragment.app.Fragment;
20
21import android.view.LayoutInflater;
22import android.view.View;
23import android.view.ViewGroup;
24import android.widget.AdapterView;
25import android.widget.ArrayAdapter;
26import android.widget.Button;
27import android.widget.DatePicker;
28import android.widget.EditText;
29import android.widget.FrameLayout;
30import android.widget.ListAdapter;
31import android.widget.ListView;
32import android.widget.TextView;
33import android.widget.TimePicker;
34import android.widget.Toast;
35
36import com.google.android.material.floatingactionbutton.FloatingActionButton;
37import com.google.firebase.database.DataSnapshot;
38import com.google.firebase.database.DatabaseError;
39import com.google.firebase.database.DatabaseReference;
40import com.google.firebase.database.FirebaseDatabase;
41import com.google.firebase.database.ValueEventListener;
42
43import org.w3c.dom.Text;
44
45import java.util.ArrayList;
46import java.util.List;
47
48public class HomeFragment extends Fragment {
49
50    private View view;
51    private ListView homeList;
52    private int selectMonth;
53    private int selectDay;
54
55    @Override
56    public View onCreateView(LayoutInflater inflater, ViewGroup container,
57                             Bundle savedInstanceState) {
58        view=inflater.inflate(R.layout.fragment_home,container,false);
59        homeList=view.findViewById(R.id.homeList1);
60        HomeListItem hlAdapter=new HomeListItem();
61        homeList.setAdapter(hlAdapter);
62        EditText met1=view.findViewById(R.id.met1);
63        TimePicker mtp1=view.findViewById(R.id.mtp1);
64        DatePicker mdp1=view.findViewById(R.id.mdp1);
65        FloatingActionButton fab1=view.findViewById(R.id.fab1);
66
67        hlAdapter.addHomeList("오정대공원","11월 24일","14:00~16:00");
68        hlAdapter.addHomeList("인천대공원","11월 25일","07:00~09:00");
69        hlAdapter.addHomeList("원적산공원","11월 27일","18:00~20:00");
70
71        fab1.setOnClickListener(new View.OnClickListener() {
72            @Override
73            public void onClick(View v) {
74                Toast.makeText(getActivity().getApplicationContext(),"클릭됨",Toast.LENGTH_LONG).show();
75                AlertDialog.Builder dlg=new AlertDialog.Builder(getActivity());
76                dlg.setTitle("경기 생성");
77                dlg.setView(R.layout.makematch);
78                dlg.setNegativeButton("닫기",null);
79                dlg.setPositiveButton("생성", new DialogInterface.OnClickListener() {
80                    @Override
81                    public void onClick(DialogInterface dialog, int which) {
82                        makeText(getActivity().getApplicationContext(),"매치가 생성되었습니다",Toast.LENGTH_LONG).show();
83                        mdp1.setOnDateChangedListener(new DatePicker.OnDateChangedListener() {
84                            @Override
85                            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
86                                selectMonth=monthOfYear+1;
87                                selectDay=dayOfMonth;
88                            }
89                        });
90                        String day=Integer.toString(selectMonth)+"월"+Integer.toString(selectDay)+"일";
91                        String time=Integer.toString(mtp1.getCurrentHour())+"시"+Integer.toString(mtp1.getCurrentMinute())+"분";
92                        hlAdapter.addHomeList(met1.getText().toString(),day,time);
93                    }
94                });
95                dlg.show();
96            }
97        });
98        return view;
99    }
100}
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

문승욱(카이론)님의 프로필 사진

여기도 보면 UI에 대한 이벤트 핸들러 세팅을 click 이벤트 안에서 하고 있는데 이렇게 하지 마시고 이벤트 핸드러의 세팅은 밖으로 빼시거나 한번만 세팅되도록 if 처리하는 것이 맞을듯합니다. 저는 전자를 권장합니다. 크래시 되는 원인이 그거라고 확정은 못하겠네요.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 11월 21일

이 문제는 AlertDialog 창에서 DatePicker와 TimePicker를 참조하지 못해서 발생하는 것 같습니다. AlertDialog는 별도의 레이아웃에 만들어져서 해당 레이아웃 내부의 컴포넌트를 직접 참조하기 어렵습니다. 따라서 View 객체를 생성하고 그 안에서 DatePicker와 TimePicker를 초기화하면 해결됩니다. 다음은 수정된 코드입니다: ```java fab1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getActivity().getApplicationContext(),"클릭됨",Toast.LENGTH_LONG).show(); AlertDialog.Builder dlg=new AlertDialog.Builder(getActivity()); dlg.setTitle("경기 생성"); // Inflate the layout for this fragment LayoutInflater inflater = HomeFragment.this.getLayoutInflater(); View dialogView = inflater.inflate(R.layout.makematch, null); DatePicker mdp1 = dialogView.findViewById(R.id.mdp1); TimePicker mtp1 = dialogView.findViewById(R.id.mtp1); EditText met1 = dialogView.findViewById(R.id.met1); dlg.setView(dialogView); dlg.setNegativeButton("닫기",null); mdp1.setOnDateChangedListener(new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { selectMonth=monthOfYear+1; selectDay=dayOfMonth; } }); dlg.setPositiveButton("생성", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { makeText(getActivity().getApplicationContext(),"매치가 생성되었습니다",Toast.LENGTH_LONG).show(); String day=Integer.toString(selectMonth)+"월"+Integer.toString(selectDay)+"일"; String time=Integer.toString(mtp1.getCurrentHour())+"시"+Integer.toString(mtp1.getCurrentMinute())+"분"; hlAdapter.addHomeList(met1.getText().toString(),day,time); } }); dlg.show(); } }); ``` 이렇게 수정하면 DatePicker와 TimePicker 객체에 올바르게 접근할 수 있습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!