Android Studio(メモリストのアプリ09_画面を押す離すといった操作2)

■タッチ操作のメモリストへの実装

前回、タッチに関する操作について見てみたけど、実際にメモリストのアプリに実装しようとするとうまくいかない。もともと、LinearLayoutにCheckBoxを追加する形でメモのリストを作成し、それぞれのCheckBoxにはsetOnCheckedChangeListenerを付けていた。これと一緒に使うことができないのかな。

チェックボックスのチェック状態が変わることで呼ばれるイベントだと思うけど、タッチの操作に応じて画面操作すると操作の内容が重複する。ので、setOnCheckedChangeListenerの中の記述をsetOnTouchListenerの中に変更する。
setOnTouchListenerを使用すると、画面全体でなく個別のViewに対して操作ができるようなので、一覧を作成するCheckBoxに対してsetしていく。

前回、GestureDetectorを使う際にすべての操作をOverrideしていたけど、Android Developerのウェブサイトを見ると、SimpleOnGestureListenerを使うと、必要なものだけオーバーライドして使うことができるよう。
下のようなコードとした。クラスは、1ファイルに1クラスとしたいので、別ファイルとして保存。

public class Sub2_Gesture extends GestureDetector.SimpleOnGestureListener {

    private LinearLayout ll1_;
    private CheckBox checkbox_;

    public Sub2_Gesture(LinearLayout ll) {
        ll1_ = ll;
    }

    @Override
    public boolean onDown(MotionEvent event) {
        return true;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        return true;
    }

    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2,
                           float velocityX, float velocityY) {
        ll1_.removeView(checkbox_);
        return true;
    }

    public void setCheckBoxOrder(CheckBox cb) {
        checkbox_ = cb;
    }
}

フリック操作を行うと、onFlingメソッドが呼ばれチェックボックスをリストから削除する。
このクラスをMainActivityから呼び出す。関係する部分をピックアップすると下のような感じ。

public class MainActivity extends AppCompatActivity implements View.OnTouchListener {

    ...(省略)...

    private GestureDetectorCompat mDetector_;
    private Sub2_Gesture Gest_;

    ...(省略)...

    @Override
    protected void onCreate(Bundle savedInstanceState) {

    ...(省略)...

        LinearLayout ll1 = findViewById(R.id.FramL01);
        Gest_ = new Sub2_Gesture(ll1);
        mDetector_ = new GestureDetectorCompat(this, Gest_);

    ...(省略)...

        cb1.setOnTouchListener(this);
  }

    ...(省略)...

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_UP) {

    ...(省略)...

        }

    return mDetector_.onTouchEvent(event);
    }
}

setしたコンポーネントに対してスマホの操作を行うと、onTouchメソッドが呼び出され、多分ここからの返り値のどこかで上のSub2_Gestureクラスが呼び出されると思う。onTouchメソッドのイベントは押すと離すで1回ずつ発生するので、例えば、タップ操作を行うと2回発生する。CheckBoxにチェックを入れた際のいろいろな操作はonTouchメソッドの中で行い、上のクラスのonFlingの操作には必要最小限のものだけ持っていく。

これでフリック操作でメモを削除する機能が実装できた。