teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

typo

2017/07/27 17:01

投稿

keicha_hrs
keicha_hrs

スコア6768

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

ちょっと書き足し

2017/07/27 17:01

投稿

keicha_hrs
keicha_hrs

スコア6768

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

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

2017/07/27 15:50

投稿

keicha_hrs
keicha_hrs

スコア6768

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が発生しているのだと思います。