개발자
안드로이드 스튜디오를 이용해서 축구 소셜 매치 어플을 제작하고 있습니다 오류. 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}
커리어리 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 객체에 올바르게 접근할 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!