回答編集履歴
3
typo
answer
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
返信欄に記述すると読みづらいと思うので、回答欄を編集する形にさせていただきます。
|
6
6
|
|
7
7
|
> どのようにコードを直すと良いと思いますか?
|
8
|
+
|
8
9
|
checkBox2とbuttonの関係だけで言えば、setOnClickListener()はすべてのパーツにおいて同列で設定しなければコードの流れが非常に読みづらくなるのでは?という話です。この例はリスナーを匿名クラスで実装していますが、別にアクティビティーのクラスにimplementsしてもいいし、内部クラスを作ってもいいし、方法はどうでもいいのですが。
|
9
10
|
```Java
|
10
11
|
@Override
|
@@ -34,6 +35,7 @@
|
|
34
35
|
いずれにせよ「setOnClickListener()はアクティビティを描画したときに1回だけ行うような構造が望ましいのでは」と考えます。質問のコードだとcheckbox2を繰り返しクリックすると何度も何度もsetOnClickListener()をすることになりますし、その都度OnClickListener()のインスタンスを新たに生成することになりますから、メモリーの無駄遣いという観点でもあまり良くないように思います。
|
35
36
|
|
36
37
|
> checkBox2がcheckされてbuttonを押したとき
|
38
|
+
|
37
39
|
意図はわかるのですが、質問のコードだとcheckBox2を2回クリックしてチェックが外れた状態でbuttonを押しても機能してしまいます。それは意図した動作なのでしょうか?「チェックが入っているときだけbuttonを聞くようにしたい」と考えているのなら、
|
38
40
|
|
39
41
|
```Java
|
2
ちょっと書き足し
answer
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
|
7
7
|
> どのようにコードを直すと良いと思いますか?
|
8
8
|
checkBox2とbuttonの関係だけで言えば、setOnClickListener()はすべてのパーツにおいて同列で設定しなければコードの流れが非常に読みづらくなるのでは?という話です。この例はリスナーを匿名クラスで実装していますが、別にアクティビティーのクラスにimplementsしてもいいし、内部クラスを作ってもいいし、方法はどうでもいいのですが。
|
9
|
-
|
10
9
|
```Java
|
11
10
|
@Override
|
12
11
|
protected void onCreate(Bundle savedInstanceState) {
|
@@ -32,6 +31,7 @@
|
|
32
31
|
}
|
33
32
|
}
|
34
33
|
```
|
34
|
+
いずれにせよ「setOnClickListener()はアクティビティを描画したときに1回だけ行うような構造が望ましいのでは」と考えます。質問のコードだとcheckbox2を繰り返しクリックすると何度も何度もsetOnClickListener()をすることになりますし、その都度OnClickListener()のインスタンスを新たに生成することになりますから、メモリーの無駄遣いという観点でもあまり良くないように思います。
|
35
35
|
|
36
36
|
> checkBox2がcheckされてbuttonを押したとき
|
37
37
|
意図はわかるのですが、質問のコードだとcheckBox2を2回クリックしてチェックが外れた状態でbuttonを押しても機能してしまいます。それは意図した動作なのでしょうか?「チェックが入っているときだけbuttonを聞くようにしたい」と考えているのなら、
|
1
返信への回答を詳しく記述
answer
CHANGED
@@ -1,1 +1,55 @@
|
|
1
|
-
そもそもonClickの中でさらにsetOnClickListener()している設計思想が決定的にダメだと思いますがね。そうした作り方を改めない限り同じことの繰り返しで、いつまで経っても思ったようには動かないでしょう。
|
1
|
+
そもそもonClickの中でさらにsetOnClickListener()している設計思想が決定的にダメだと思いますがね。そうした作り方を改めない限り同じことの繰り返しで、いつまで経っても思ったようには動かないでしょう。
|
2
|
+
|
3
|
+
---
|
4
|
+
|
5
|
+
返信欄に記述すると読みづらいと思うので、回答欄を編集する形にさせていただきます。
|
6
|
+
|
7
|
+
> どのようにコードを直すと良いと思いますか?
|
8
|
+
checkBox2とbuttonの関係だけで言えば、setOnClickListener()はすべてのパーツにおいて同列で設定しなければコードの流れが非常に読みづらくなるのでは?という話です。この例はリスナーを匿名クラスで実装していますが、別にアクティビティーのクラスにimplementsしてもいいし、内部クラスを作ってもいいし、方法はどうでもいいのですが。
|
9
|
+
|
10
|
+
```Java
|
11
|
+
@Override
|
12
|
+
protected void onCreate(Bundle savedInstanceState) {
|
13
|
+
super.onCreate(savedInstanceState);
|
14
|
+
setContentView(R.layout.activity_sub1);
|
15
|
+
|
16
|
+
final CheckBox checkBox2 = (CheckBox) findViewById(R.id.checkBox2);
|
17
|
+
final Button button = (Button) findViewById(R.id.button);
|
18
|
+
|
19
|
+
checkBox2.setOnClickListener(new View.OnClickListener() {
|
20
|
+
@Override
|
21
|
+
public void onClick(View v) {
|
22
|
+
|
23
|
+
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
button.setOnClickListener(new View.OnClickListener() {
|
28
|
+
@Override
|
29
|
+
public void onClick(View v) {
|
30
|
+
|
31
|
+
|
32
|
+
}
|
33
|
+
}
|
34
|
+
```
|
35
|
+
|
36
|
+
> checkBox2がcheckされてbuttonを押したとき
|
37
|
+
意図はわかるのですが、質問のコードだとcheckBox2を2回クリックしてチェックが外れた状態でbuttonを押しても機能してしまいます。それは意図した動作なのでしょうか?「チェックが入っているときだけbuttonを聞くようにしたい」と考えているのなら、
|
38
|
+
|
39
|
+
```Java
|
40
|
+
button.setOnClickListener(new View.OnClickListener() {
|
41
|
+
@Override
|
42
|
+
public void onClick(View v) {
|
43
|
+
if(checkbox2.isChecked()) {
|
44
|
+
// ボタンをおしたときの処理
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
```
|
49
|
+
のように、buttonを押したときのonClick()の中でcheckbox2の状態を調べて判定するコードにしなければならないのでは?と思います。
|
50
|
+
|
51
|
+
---
|
52
|
+
|
53
|
+
次にMyAppというクラス、Applicationを継承するクラスを作ってデータ共有するというのは、
|
54
|
+
[APPLICATIONクラスを継承して、データの共有をする。](https://techbooster.org/android/application/2353/)
|
55
|
+
このあたりを参考にされたのかな?と思うのですが、これで作ったものをインスタンス化して利用できるようにするためには、AndroidManifest.xmlの編集が必要です。それは上記リンクの記事にも書かれている通りです。それを行っていないのではないでしょうか。そのためにMyAppがインスタンス化されておらず、それを参照しようとしてNullPointerExceptionが発生しているのだと思います。
|