回答編集履歴
7
追記
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 ダイアログを管理(表示)するのはアクティビティのフラグメントマネージャで無く
|
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
修正
test
CHANGED
@@ -9,14 +9,13 @@
|
|
9
9
|
```
|
10
10
|
の個所で「 (getActivity で得られる )MainActivity が DatePickerDialog.OnDateSetListener では無い ( からキャスト出来ない ) 」と言われています。
|
11
11
|
|
12
|
-
|
12
|
+
>このエラーメッセージをみてもMainActivityがなぜ関係しているのか
|
13
|
-
|
13
|
+
|
14
|
-
p
|
14
|
+
SampleFragment 内に getActivity が幾つもあり、 MainActivity を使っています。例外の個所はそのうちの 1 つです。
|
15
|
-
```
|
16
|
-
```java
|
17
|
-
|
15
|
+
使っているのを分からなかったということは、元のコードがどこで何をする為にどう書かれていたのかを読み切れていなかったということでしょう。
|
18
|
-
|
16
|
+
|
19
|
-
リンク先の記事に
|
17
|
+
また、リンク先の記事に
|
18
|
+
|
20
19
|
>DatePickerDialogFragmentクラスにOnDateSetメソッドを書いた場合、どのような記述をすれば選択した日付をtestDatePickerActivityに表示できるのかわからなかった。onDateSetメソッドをtestDatePickerActivityで継承したらなんとかできたのでよかったねというお話でした。
|
21
20
|
|
22
21
|
とありますが、この構造はフラグメントの親が何なのかが決まっていることを前提にしており、それはフラグメントの独立性として良いものではありません。
|
5
微修正
test
CHANGED
@@ -24,10 +24,10 @@
|
|
24
24
|
|
25
25
|
---
|
26
26
|
とりあえず FragmentResult とかは置いておいて SimpleFragment 内で完結するならこんな感じでしょうか。
|
27
|
-
- OnDateSetListener は
|
27
|
+
- DatePickerDialog コンストラクタの第 2 引数として指定する OnDateSetListener は、 MainActivity では無く SampleFragment を指すようにする。(getParentFragment で得られる)
|
28
|
-
- ダイアログを管理するのはアクティビティのフラグメントマネージャで無く直接の親である SampleFragment のフラグメントマネージャ(getChildFragmentManager で得られる)
|
28
|
+
- DatePickerDialog ダイアログを管理(表示)するのはアクティビティのフラグメントマネージャで無く、直接の親である SampleFragment のフラグメントマネージャとする。(getChildFragmentManager で得られる)
|
29
|
-
- コンテキストは requireContext で得る
|
29
|
+
- コンテキストは requireContext で得られる。
|
30
|
-
- OnDateSetListener の onDateSet メソッドの第
|
30
|
+
- OnDateSetListener の onDateSet メソッドの第 1 引数の view はカレンダーなので view.findViewById(R.id.tvPeriodDisplay) しても SimpleFragment のレイアウト上のものは取れない。 SampleFrament のコンストラクタで View を得ておいて使うのが簡単。
|
31
31
|
|
32
32
|
```java
|
33
33
|
import android.app.*;
|
4
追記
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
コード追加
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
修正
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
追加修正
test
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
```
|
1
|
-
|
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
|