回答編集履歴

7

追記

2024/02/23 09:45

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -23,8 +23,8 @@
23
23
 
24
24
  ---
25
25
  とりあえず FragmentResult とかは置いておいて SimpleFragment 内で完結するならこんな感じでしょうか。
26
- - DatePickerDialog コンストラクタの第 2 引数として指定する OnDateSetListener は、 MainActivity では無く SampleFragment を指すようにする。(getParentFragment で得られる)
26
+ - DatePickerDialog コンストラクタの第 2 引数として指定する OnDateSetListener は、 MainActivity では無く SampleFragment を指すようにする。(DatePickerFragment 内で getParentFragment で得られる)
27
- - DatePickerDialog ダイアログを管理(表示)するのはアクティビティのフラグメントマネージャで無く直接の親である SampleFragment のフラグメントマネージャとする。(getChildFragmentManager で得られる)
27
+ - DatePickerDialog ダイアログを管理(表示)するのはアクティビティのフラグメントマネージャで無く直接の親である SampleFragment のフラグメントマネージャとする。(SampleFragment 内で getChildFragmentManager で得られる)
28
28
  - コンテキストは requireContext で得られる。
29
29
  - OnDateSetListener の onDateSet メソッドの第 1 引数の view はカレンダーなので view.findViewById(R.id.tvPeriodDisplay) しても SimpleFragment のレイアウト上のものは取れない。 SampleFrament のコンストラクタで View を得ておいて使うのが簡単。
30
30
 

6

修正

2024/02/22 17:59

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -9,14 +9,13 @@
9
9
  ```
10
10
  の個所で「 (getActivity で得られる )MainActivity が DatePickerDialog.OnDateSetListener では無い ( からキャスト出来ない ) 」と言われています。
11
11
 
12
- ご自身とリンク先のとアクティビティの定義良く見くださ
12
+ >こエラーメッセージもMainActivityがなぜ関係してるのか
13
- ```java
13
+
14
- public class MainActivity extends AppCompatActivity {
14
+ SampleFragment 内に getActivity が幾つもあり、 MainActivity を使っています。例外の個所はそのうちの 1 つです。
15
- ```
16
- ```java
17
- public class TestDatePickerActivity extends AppCompatActivity implements View.OnClickListener, DatePickerDialog.OnDateSetListener{
15
+ 使っているのを分からなかったということは、元のコードがどこで何をする為にどう書かれていたのかを読み切れていなかったということでしょう。
18
- ```
16
+
19
- リンク先の記事に
17
+ また、リンク先の記事に
18
+
20
19
  >DatePickerDialogFragmentクラスにOnDateSetメソッドを書いた場合、どのような記述をすれば選択した日付をtestDatePickerActivityに表示できるのかわからなかった。onDateSetメソッドをtestDatePickerActivityで継承したらなんとかできたのでよかったねというお話でした。
21
20
 
22
21
  とありますが、この構造はフラグメントの親が何なのかが決まっていることを前提にしており、それはフラグメントの独立性として良いものではありません。

5

微修正

2024/02/22 17:49

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -24,10 +24,10 @@
24
24
 
25
25
  ---
26
26
  とりあえず FragmentResult とかは置いておいて SimpleFragment 内で完結するならこんな感じでしょうか。
27
- - OnDateSetListener は parentActivity では無く parentFragment (=SampleFragment クラス)
27
+ - DatePickerDialog コンストラクタの第 2 引数として指定する OnDateSetListener は MainActivity では無く SampleFragment を指すようにする。(getParentFragment で得られる)
28
- - ダイアログを管理するのはアクティビティのフラグメントマネージャで無く直接の親である SampleFragment のフラグメントマネージャ(getChildFragmentManager で得られる)
28
+ - DatePickerDialog ダイアログを管理(表示)するのはアクティビティのフラグメントマネージャで無く直接の親である SampleFragment のフラグメントマネージャとする。(getChildFragmentManager で得られる)
29
- - コンテキストは requireContext で得る
29
+ - コンテキストは requireContext で得られ
30
- - OnDateSetListener の onDateSet メソッドの第引数の View はカレンダーなので view.findViewById(R.id.tvPeriodDisplay) しても SimpleFragment のレイアウト上のものは取れません。SampleFrament のコンストラクタで View を得ておいて使うのが簡単です
30
+ - OnDateSetListener の onDateSet メソッドの第 1 引数の view はカレンダーなので view.findViewById(R.id.tvPeriodDisplay) しても SimpleFragment のレイアウト上のものは取れない SampleFrament のコンストラクタで View を得ておいて使うのが簡単。
31
31
 
32
32
  ```java
33
33
  import android.app.*;

4

追記

2024/02/22 05:21

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -24,6 +24,11 @@
24
24
 
25
25
  ---
26
26
  とりあえず FragmentResult とかは置いておいて SimpleFragment 内で完結するならこんな感じでしょうか。
27
+ - OnDateSetListener は parentActivity では無く parentFragment (=SampleFragment クラス)
28
+ - ダイアログを管理するのはアクティビティのフラグメントマネージャで無く直接の親である SampleFragment のフラグメントマネージャ(getChildFragmentManager で得られる)
29
+ - コンテキストは requireContext で得る
30
+ - OnDateSetListener の onDateSet メソッドの第一引数の View はカレンダーなので view.findViewById(R.id.tvPeriodDisplay) しても SimpleFragment のレイアウト上のものは取れません。SampleFrament のコンストラクタで View を得ておいて使うのが簡単です。
31
+
27
32
  ```java
28
33
  import android.app.*;
29
34
  import android.os.Bundle;

3

コード追加

2024/02/22 05:13

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -21,3 +21,61 @@
21
21
 
22
22
  とありますが、この構造はフラグメントの親が何なのかが決まっていることを前提にしており、それはフラグメントの独立性として良いものではありません。
23
23
  フラグメントの結果は [FragmentResult](https://developer.android.com/guide/fragments/communicate?hl=ja) (や ViewModel) を用いて間接的に他に伝えるようにするべきと思います。
24
+
25
+ ---
26
+ とりあえず FragmentResult とかは置いておいて SimpleFragment 内で完結するならこんな感じでしょうか。
27
+ ```java
28
+ import android.app.*;
29
+ import android.os.Bundle;
30
+ import android.view.View;
31
+ import android.widget.*;
32
+
33
+ import androidx.annotation.*;
34
+ import androidx.fragment.app.DialogFragment;
35
+ import androidx.fragment.app.Fragment;
36
+
37
+ import java.util.Calendar;
38
+
39
+ public class SampleFragment extends Fragment implements DatePickerDialog.OnDateSetListener {
40
+ private TextView inputDate;
41
+
42
+ public SampleFragment() {
43
+ super(R.layout.fragment_sample);
44
+ }
45
+
46
+ @Override
47
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
48
+ super.onViewCreated(view, savedInstanceState);
49
+
50
+ inputDate = view.findViewById(R.id.tvPeriodDisplay);
51
+
52
+ Button btPeriod = view.findViewById(R.id.btPeriod);
53
+ btPeriod.setOnClickListener(new BtPeriodClickListener());
54
+ }
55
+
56
+ public static class DatePickerFragment extends DialogFragment {
57
+ @Override
58
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
59
+ final Calendar cl = Calendar.getInstance();
60
+ int year = cl.get(Calendar.YEAR);
61
+ int month = cl.get(Calendar.MONTH);
62
+ int day = cl.get(Calendar.DAY_OF_MONTH);
63
+ return new DatePickerDialog(requireContext(), (DatePickerDialog.OnDateSetListener)getParentFragment(), year, month, day);
64
+ }
65
+ }
66
+
67
+ @Override
68
+ public void onDateSet(DatePicker view, int year, int month, int day) {
69
+ String outputDate = String.format("%d/%d/%d", year, month+1, day);
70
+ inputDate.setText(outputDate);
71
+ }
72
+
73
+ private class BtPeriodClickListener implements View.OnClickListener {
74
+ @Override
75
+ public void onClick(View view) {
76
+ DatePickerFragment dpFragment= new DatePickerFragment();
77
+ dpFragment.show(getChildFragmentManager(), null);
78
+ }
79
+ }
80
+ }
81
+ ```

2

修正

2024/02/22 04:49

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -16,6 +16,8 @@
16
16
  ```java
17
17
  public class TestDatePickerActivity extends AppCompatActivity implements View.OnClickListener, DatePickerDialog.OnDateSetListener{
18
18
  ```
19
+ リンク先の記事にも
20
+ >DatePickerDialogFragmentクラスにOnDateSetメソッドを書いた場合、どのような記述をすれば選択した日付をtestDatePickerActivityに表示できるのかわからなかった。onDateSetメソッドをtestDatePickerActivityで継承したらなんとかできたのでよかったねというお話でした。
19
21
 
20
- なお質問コードの構造はフラグメントの親が何なのかが決まっていることを前提にしており、それはフラグメントの独立性として良いものではありません。
22
+ とありますがの構造はフラグメントの親が何なのかが決まっていることを前提にしており、それはフラグメントの独立性として良いものではありません。
21
- フラグメントの結果は FragmentResult や ViewModel を用いて間接的に他に伝えるようにするべきと思います。
23
+ フラグメントの結果は [FragmentResult](https://developer.android.com/guide/fragments/communicate?hl=ja) (や ViewModel) を用いて間接的に他に伝えるようにするべきと思います。

1

追加修正

2024/02/22 04:37

投稿

jimbe
jimbe

スコア12744

test CHANGED
@@ -1,6 +1,13 @@
1
+ ```
1
- >ClassCastException: com.websarva.wings.android.error.MainActivity cannot be cast to android.app.DatePickerDialog$OnDateSetListener
2
+ ClassCastException: com.websarva.wings.android.error.MainActivity cannot be cast to android.app.DatePickerDialog$OnDateSetListener
2
-
3
+ at com.websarva.wings.android.error.SampleFragment$DatePickerFragment.onCreateDialog(SampleFragment.java:51)
4
+ ```
5
+ は、 import 等が省略されているため行番号が一致しませんが
6
+ ```java
7
+ // Create a new instance of DatePickerDialog and return it.
8
+ return new DatePickerDialog(parentActivity, (DatePickerDialog.OnDateSetListener)getActivity(), year, month, day);
9
+ ```
3
- 「MainActivity が DatePickerDialog.OnDateSetListener では無い」と言われています。
10
+ の個所で (getActivity で得られる )MainActivity が DatePickerDialog.OnDateSetListener では無い ( からキャスト出来ない ) 」と言われています。
4
11
 
5
12
  ご自身のとリンク先のとアクティビティの定義を良く見てください。
6
13
  ```java