回答編集履歴

3

typo

2017/07/27 17:01

投稿

keicha_hrs
keicha_hrs

スコア6766

test CHANGED
@@ -11,6 +11,8 @@
11
11
 
12
12
 
13
13
  > どのようにコードを直すと良いと思いますか?
14
+
15
+
14
16
 
15
17
  checkBox2とbuttonの関係だけで言えば、setOnClickListener()はすべてのパーツにおいて同列で設定しなければコードの流れが非常に読みづらくなるのでは?という話です。この例はリスナーを匿名クラスで実装していますが、別にアクティビティーのクラスにimplementsしてもいいし、内部クラスを作ってもいいし、方法はどうでもいいのですが。
16
18
 
@@ -70,6 +72,8 @@
70
72
 
71
73
  > checkBox2がcheckされてbuttonを押したとき
72
74
 
75
+
76
+
73
77
  意図はわかるのですが、質問のコードだとcheckBox2を2回クリックしてチェックが外れた状態でbuttonを押しても機能してしまいます。それは意図した動作なのでしょうか?「チェックが入っているときだけbuttonを聞くようにしたい」と考えているのなら、
74
78
 
75
79
 

2

ちょっと書き足し

2017/07/27 17:01

投稿

keicha_hrs
keicha_hrs

スコア6766

test CHANGED
@@ -13,8 +13,6 @@
13
13
  > どのようにコードを直すと良いと思いますか?
14
14
 
15
15
  checkBox2とbuttonの関係だけで言えば、setOnClickListener()はすべてのパーツにおいて同列で設定しなければコードの流れが非常に読みづらくなるのでは?という話です。この例はリスナーを匿名クラスで実装していますが、別にアクティビティーのクラスにimplementsしてもいいし、内部クラスを作ってもいいし、方法はどうでもいいのですが。
16
-
17
-
18
16
 
19
17
  ```Java
20
18
 
@@ -66,6 +64,8 @@
66
64
 
67
65
  ```
68
66
 
67
+ いずれにせよ「setOnClickListener()はアクティビティを描画したときに1回だけ行うような構造が望ましいのでは」と考えます。質問のコードだとcheckbox2を繰り返しクリックすると何度も何度もsetOnClickListener()をすることになりますし、その都度OnClickListener()のインスタンスを新たに生成することになりますから、メモリーの無駄遣いという観点でもあまり良くないように思います。
68
+
69
69
 
70
70
 
71
71
  > checkBox2がcheckされてbuttonを押したとき

1

返信への回答を詳しく記述

2017/07/27 15:50

投稿

keicha_hrs
keicha_hrs

スコア6766

test CHANGED
@@ -1 +1,109 @@
1
1
  そもそもonClickの中でさらにsetOnClickListener()している設計思想が決定的にダメだと思いますがね。そうした作り方を改めない限り同じことの繰り返しで、いつまで経っても思ったようには動かないでしょう。
2
+
3
+
4
+
5
+ ---
6
+
7
+
8
+
9
+ 返信欄に記述すると読みづらいと思うので、回答欄を編集する形にさせていただきます。
10
+
11
+
12
+
13
+ > どのようにコードを直すと良いと思いますか?
14
+
15
+ checkBox2とbuttonの関係だけで言えば、setOnClickListener()はすべてのパーツにおいて同列で設定しなければコードの流れが非常に読みづらくなるのでは?という話です。この例はリスナーを匿名クラスで実装していますが、別にアクティビティーのクラスにimplementsしてもいいし、内部クラスを作ってもいいし、方法はどうでもいいのですが。
16
+
17
+
18
+
19
+ ```Java
20
+
21
+ @Override
22
+
23
+ protected void onCreate(Bundle savedInstanceState) {
24
+
25
+ super.onCreate(savedInstanceState);
26
+
27
+ setContentView(R.layout.activity_sub1);
28
+
29
+
30
+
31
+ final CheckBox checkBox2 = (CheckBox) findViewById(R.id.checkBox2);
32
+
33
+ final Button button = (Button) findViewById(R.id.button);
34
+
35
+
36
+
37
+ checkBox2.setOnClickListener(new View.OnClickListener() {
38
+
39
+ @Override
40
+
41
+ public void onClick(View v) {
42
+
43
+
44
+
45
+
46
+
47
+ }
48
+
49
+ }
50
+
51
+
52
+
53
+ button.setOnClickListener(new View.OnClickListener() {
54
+
55
+ @Override
56
+
57
+ public void onClick(View v) {
58
+
59
+
60
+
61
+
62
+
63
+ }
64
+
65
+ }
66
+
67
+ ```
68
+
69
+
70
+
71
+ > checkBox2がcheckされてbuttonを押したとき
72
+
73
+ 意図はわかるのですが、質問のコードだとcheckBox2を2回クリックしてチェックが外れた状態でbuttonを押しても機能してしまいます。それは意図した動作なのでしょうか?「チェックが入っているときだけbuttonを聞くようにしたい」と考えているのなら、
74
+
75
+
76
+
77
+ ```Java
78
+
79
+ button.setOnClickListener(new View.OnClickListener() {
80
+
81
+ @Override
82
+
83
+ public void onClick(View v) {
84
+
85
+ if(checkbox2.isChecked()) {
86
+
87
+ // ボタンをおしたときの処理
88
+
89
+ }
90
+
91
+ }
92
+
93
+ }
94
+
95
+ ```
96
+
97
+ のように、buttonを押したときのonClick()の中でcheckbox2の状態を調べて判定するコードにしなければならないのでは?と思います。
98
+
99
+
100
+
101
+ ---
102
+
103
+
104
+
105
+ 次にMyAppというクラス、Applicationを継承するクラスを作ってデータ共有するというのは、
106
+
107
+ [APPLICATIONクラスを継承して、データの共有をする。](https://techbooster.org/android/application/2353/)
108
+
109
+ このあたりを参考にされたのかな?と思うのですが、これで作ったものをインスタンス化して利用できるようにするためには、AndroidManifest.xmlの編集が必要です。それは上記リンクの記事にも書かれている通りです。それを行っていないのではないでしょうか。そのためにMyAppがインスタンス化されておらず、それを参照しようとしてNullPointerExceptionが発生しているのだと思います。