Android Studio(メモリストのアプリ02_ボタンとチェックボックスのリスナー)

■前回の設計に基づいてAndroidの画面を作成。
SQLiteを使用するつもりだけど、とりあえずxmlファイル、javaファイルで画面を作成する。
できたのがこれ。

一番上の「sampleProject006_SQLIte」はプロジェクト名でデフォルトで入るもの。作成したのは、BUTTON以下。ボタンの下にEditText(Note333となっている部分)、さらに下にLinearLayoutがあり、その中にチェックボックスが入っている。

OnClickListenerを使って、ボタンを押したときにEditTextの中身をもったチェックボックスを追加する。コードは下のもの。Empty Activityでプロジェクトを作成したときにonCreateもデフォルトで入るため、その中にコードを入れている。ここは起動時に動作する。

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        /** Empty Activityでデフォルトで設定 **/
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /** DatabaseHelperクラスの作成**/
        省略
        /** データベースの内容をチェックボックスに反映**/
        省略

        /** ボタンをクリックしたら、EditTextの内容でチェックボックスを追加**/
        Button bt = (Button) findViewById(R.id.bt01);
        bt.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                LinearLayout ll1 = findViewById(R.id.linearLayout01);
                EditText et = findViewById(R.id.et01);
                CheckBox cb1 = new CheckBox(ll1.getContext());
                cb1.setText(et.getText());
                cb1.setOnCheckedChangeListener(MainActivity.this);
                ll1.addView(cb1);
            }
        });
    }

この中のsetOnCheckedChangeListenerでチェックボックスの状態が変わったときのリスナーを設定。ボタンと同じような方法でも実装できるのではと思うけど、こちらは、クラスにimplementsを使った上でメソッドを実装している。

public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {

コードが下のもの。

    /** チェックボックスが押されたときの挙動**/
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            Log.i("Debug111", "チェックボックスが押されました");
            LinearLayout ll1 = findViewById(R.id.linearLayout01);
            ll1.removeViewAt(2);
            Log.i("Debug222", "2番目削除");

        } else {
            Log.i("Debug333", "チェックボックスが押されてません");
        }
    }

コード中ではCompoundButtonとなっているけど、Androidのホームページを見ると、CheckBoxはこれのサブクラスだったので、あまり気にせず使用。

ログは、挙動を確認するために見ている。動作させると、ログが表示されて、チェックボックスが1つ消えている(2番目削除と書いたけど、0からカウントするので、removeViewAt(2)で消えるのは3番目だった)。

デバッグして、LinearLayoutの要素を見ると、入っているチェックボックスもmChildrenとして持っているので、チェックされているもののみ削除するといったことはできそう。