Android Studio(メモリストのアプリ03_チェックしたものをリストから削除)

■ボタンを押してチェックボックスのチェックが入っているものを削除する。
前回からコードを修正して、以下のような動作にした。まず初期画面。


削除したいものにチェックを入れる。この時、ボタンの名前を「DELETE」に変更する。また、入力用のEditTextを無効にする。キャプチャには載せていないけど、チェックをすべて外すと「REGISTER」に戻り、EditTextも有効化される。


「DELETE」ボタンを押すと、チェックしたものが削除される。ボタンとEditTextも登録ができる状態に戻る。


「REGISTER」ボタンを押すと、EditTextの文字列(ここではNote)がチェックボックスとして追加される。

ボタンとチェックボックス部分のコードが下の通り。

ボタンでは、まず文字列が"Register"という名前になっているかどうかで分岐分け。Registerなら、登録のコード、それ以外で削除のコード。削除のコードについて、LinearLayoutの上にチェックボックスが追加されるため、getChildCountで追加されている数をカウントし、getChildAt(i)で i 番目の要素を取得し、isCheckedでチェックが入っているかを判断して削除する。
ここで0番目から動かすと、1番目を削除したら2番目が1番目になるため、意図した動作にならない。そのため、数が大きい方から順に削除している。

        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);
                if (bt.getText() == "Register") {
                    CheckBox cb1 = new CheckBox(ll1.getContext());
                    cb1.setText(et.getText());
                    cb1.setOnCheckedChangeListener(MainActivity.this);
                    ll1.addView(cb1);
                    et.setText("");
                } else {
                    for (int i = ll1.getChildCount()-1; i >= 0; i--) {
                        CheckBox obj = (CheckBox) ll1.getChildAt(i);
                        if (obj.isChecked()) {
                            ll1.removeViewAt(i);
                        }
                    }
                    bt.setText("Register");
                    et.setEnabled(true);
                }
            }
        });

チェックボックスでは、チェックが入ったときと外れたときにonCheckedChangedが動くよう。まず、チェックが入ったとき外れたときで分岐。チェックが入ったら、ボタンの名称を変更して、EditTextを無効化する。チェックが外れたら、チェックが入っているものがないか確認して、すべてのチェックボックスにチェックが入っていなかったら、ボタンの名称とEditTextの無効化を解除する。

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        LinearLayout ll1 = findViewById(R.id.linearLayout01);

        if (isChecked) {
            Log.i("Debug111", "チェックボックスが押されました");

            for (int i = 0; i < ll1.getChildCount(); i++) {
                CheckBox obj = (CheckBox) ll1.getChildAt(i);
                Log.i("Deb1111", obj.toString() + ":" + obj.isChecked());
                if (obj.isChecked()) {
                    EditText et = findViewById(R.id.et01);
                    et.setEnabled(false);
                    Button bt = findViewById(R.id.bt01);
                    bt.setText("Delete");
                    break;
                } else {
                    EditText et = findViewById(R.id.et01);
                    et.setEnabled(true);
                }
            }
        } else {
            Log.i("Debug333", "チェックボックスが外されました");
            int count = 0;
            for (int i = 0; i < ll1.getChildCount(); i++) {
                CheckBox obj = (CheckBox) ll1.getChildAt(i);
                Log.i("Deb2222", obj.toString() + ":" + obj.isChecked());
                if (obj.isChecked()) {
                } else {
                    count ++;
                }
            }
            if(count==ll1.getChildCount()){
                EditText et = findViewById(R.id.et01);
                Button bt = findViewById(R.id.bt01);
                bt.setText("Register");
                et.setEnabled(true);
            }
        }
    }

これで大まかな機能はできた。テストの内容は少し考えたいけど一端実装は終了。

次に、入力する文字数や表示について検討する。
半角文字で20、50、200、全角文字で10、30、100を追加した際の結果が下のもの。
全角文字100まで追加すると文字が切れている。シミュレータでは画面を下の方向へスライドさせることができなかったので、何かしら実装かプロパティを変更する必要があるのかな。あと、例えば、表示部分は20文字程度にして、それ以降はチェックされたら表示されるといった形にできないかな。