回答編集履歴

3

バグ修正

2023/12/10 08:14

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -68,7 +68,7 @@
68
68
  Button btBackStudy = view.findViewById(R.id.btBackTodo);
69
69
  btBackStudy.setOnClickListener(v -> {
70
70
  Toast.makeText(getContext(), "戻るボタンがクリックされました", Toast.LENGTH_SHORT).show();
71
- getParentFragmentManager().setFragmentResult("", new Bundle()); //(MainActivity に)通知
71
+ getParentFragmentManager().setFragmentResult(REQUEST_KEY, new Bundle()); //(MainActivity に)通知
72
72
  });
73
73
 
74
74
  Button addButton = view.findViewById(R.id.btAdd);

2

説明追加

2023/12/10 08:01

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -1,3 +1,7 @@
1
+ コード量的に書き込めるか確かめるだけのつもりが操作誤って書き込んでしまいました汗
2
+ やはり全部は書き込めなかったので java コードだけ載せ、レイアウト等を含めた一通りは [github](https://github.com/Jimbe-github/q_lkjjk9q1i9honb/tree/master/app/src/main) に入れました。
3
+ Todo や AddTask をフラグメントにしています。
4
+
1
5
  MainActivity.java
2
6
  ```java
3
7
  import androidx.appcompat.app.AppCompatActivity;

1

書き込めるか試すつもりが誤って中途で書き込んでしまったので追加

2023/12/10 07:55

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -24,6 +24,178 @@
24
24
  }
25
25
  }
26
26
  ```
27
- activity_main.xml
27
+ TodoFragment.java (TodoAdapter,Task クラスを含む)
28
- ```xml
28
+ ```java
29
+ import androidx.annotation.*;
30
+ import androidx.fragment.app.*;
31
+ import androidx.recyclerview.widget.*;
32
+
33
+ import android.os.Bundle;
34
+ import android.util.Log;
35
+ import android.view.*;
36
+ import android.widget.*;
37
+
38
+ import java.io.Serializable;
39
+ import java.time.LocalDateTime;
40
+ import java.time.format.DateTimeFormatter;
41
+ import java.util.*;
42
+
43
+ public class TodoFragment extends Fragment {
44
+ static final String REQUEST_KEY = "TodoFragment";
45
+
46
+ public TodoFragment() {
47
+ super(R.layout.fragment_todo);
48
+ }
49
+
50
+ @Override
51
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
52
+ super.onViewCreated(view, savedInstanceState);
53
+
54
+ TaskAdapter taskAdapter = new TaskAdapter();
55
+
56
+ RecyclerView recyclerView = view.findViewById(R.id.recyclerViewTasks);
57
+ recyclerView.setAdapter(taskAdapter);
58
+
59
+ FragmentManager fm = getChildFragmentManager();
60
+ fm.setFragmentResultListener(AddTaskFragment.REQUEST_KEY, getViewLifecycleOwner(), (rkey, result) -> {
61
+ taskAdapter.addTask((Task) result.getSerializable(AddTaskFragment.RESULTKEY_TASK));
62
+ });
63
+
64
+ Button btBackStudy = view.findViewById(R.id.btBackTodo);
65
+ btBackStudy.setOnClickListener(v -> {
66
+ Toast.makeText(getContext(), "戻るボタンがクリックされました", Toast.LENGTH_SHORT).show();
67
+ getParentFragmentManager().setFragmentResult("", new Bundle()); //(MainActivity に)通知
68
+ });
69
+
70
+ Button addButton = view.findViewById(R.id.btAdd);
71
+ addButton.setOnClickListener(v -> {
72
+ Toast.makeText(getContext(), "追加ボタンがクリックされました", Toast.LENGTH_SHORT).show();
73
+ new AddTaskFragment().show(fm, null); //ダイアログ表示
74
+ });
75
+ }
76
+ }
77
+
78
+ class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.ViewHolder> {
79
+ private final List<Task> taskList = new ArrayList<>();
80
+
81
+ void addTask(Task task) {
82
+ Log.d("TaskAdded", "Task added: " + task);
83
+ taskList.add(task);
84
+ notifyItemInserted(taskList.size()-1);
85
+ }
86
+
87
+ @NonNull
88
+ @Override
89
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
90
+ return new ViewHolder(parent);
91
+ }
92
+
93
+ @Override
94
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
95
+ Log.d("AdapterDebug", "onBindViewHolder called for position: " + position);
96
+ holder.bind(taskList.get(position));
97
+ }
98
+
99
+ @Override
100
+ public int getItemCount() {
101
+ return taskList.size();
102
+ }
103
+
104
+ static class ViewHolder extends RecyclerView.ViewHolder {
105
+ private final TextView taskName, dateTime;
106
+
107
+ public ViewHolder(@NonNull ViewGroup parent) {
108
+ super(LayoutInflater.from(parent.getContext()).inflate(R.layout.task_item, parent, false));
109
+ taskName = itemView.findViewById(R.id.taskNameTextView);
110
+ dateTime = itemView.findViewById(R.id.dateTimeTextView);
111
+ }
112
+ void bind(Task task) {
113
+ taskName.setText(task.taskName);
114
+ dateTime.setText(task.getDateTime());
115
+ }
116
+ }
117
+ }
118
+
119
+ class Task implements Serializable {
120
+ static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
121
+
122
+ final String taskName;
123
+ final LocalDateTime dateTime;
124
+
125
+ public Task(String taskName, LocalDateTime dateTime) {
126
+ this.taskName = taskName;
127
+ this.dateTime = dateTime;
128
+ }
129
+ String getDateTime() {
130
+ return formatter.format(dateTime);
131
+ }
132
+
133
+ @Override
134
+ public String toString() {
135
+ return taskName + " at " + getDateTime();
136
+ }
137
+ }
29
138
  ```
139
+ AddTaskFragment.java
140
+ ```java
141
+ import androidx.annotation.*;
142
+ import androidx.appcompat.app.AlertDialog;
143
+ import androidx.fragment.app.DialogFragment;
144
+
145
+ import android.app.*;
146
+ import android.os.Bundle;
147
+ import android.view.*;
148
+ import android.widget.*;
149
+
150
+ import java.time.*;
151
+
152
+ public class AddTaskFragment extends DialogFragment {
153
+ static final String REQUEST_KEY = "AddTaskFragment";
154
+ static final String RESULTKEY_TASK = "task";
155
+
156
+ private EditText nameView, datetimeView;
157
+ private LocalDateTime datetime;
158
+
159
+ @NonNull
160
+ @Override
161
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
162
+ View view = LayoutInflater.from(requireContext()).inflate(R.layout.fragment_add_task, null);
163
+
164
+ datetime = LocalDateTime.now();
165
+
166
+ nameView = view.findViewById(R.id.editTextTaskName);
167
+ datetimeView = view.findViewById(R.id.editTextDateTime);
168
+ datetimeView.setOnClickListener(v -> showDatePickerDialog());
169
+
170
+ return new AlertDialog.Builder(requireContext())
171
+ .setTitle("Add Task")
172
+ .setView(view)
173
+ .setPositiveButton("保存", (d, w) -> {
174
+ String name = nameView.getText().toString();
175
+ Bundle result = new Bundle();
176
+ result.putSerializable(RESULTKEY_TASK, new Task(name, datetime));
177
+ getParentFragmentManager().setFragmentResult(REQUEST_KEY, result);
178
+ dismiss();
179
+ })
180
+ .setNegativeButton("キャンセル", (d, w) -> dismiss())
181
+ .create();
182
+ }
183
+
184
+ private void showDatePickerDialog() {
185
+ DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(), (v, y, m, d) -> { //m: 0-11
186
+ datetime = datetime.with(LocalDate.of(y, m+1, d)); //m: 1-12
187
+ showTimePickerDialog();
188
+ }, datetime.getYear(), datetime.getMonthValue()-1, datetime.getDayOfMonth()); //m: 0-11
189
+ datePickerDialog.show();
190
+ }
191
+
192
+ private void showTimePickerDialog() {
193
+ TimePickerDialog timePickerDialog = new TimePickerDialog(getContext(), (v, h, m) -> {
194
+ datetime = datetime.with(LocalTime.of(h, m));
195
+ datetimeView.setText(Task.formatter.format(datetime));
196
+ }, datetime.getHour(), datetime.getMinute(), true);
197
+ timePickerDialog.show();
198
+ }
199
+ }
200
+ ```
201
+