【Kotlin】複数ボタンの同時タップを制御する

Androidアプリでユーザーが複数のボタンを同時にタップできないような制御を実装していきます。
下の画像のように`Button1`と`Button2`を同時にタップすると、ダイアログが2つ表示されてしまうことがあるため(ボタン2のダイアログを消したあとにボタン1のダイアログが表示される )、同時に複数のボタンをタップできないような制御が必要となります。

また、`TabLayout`のタブに関しても同様に複数のタブを同時にタップできないよう制御が必要なケースもあり、Button時と実装方法が若干異なり、日本語での記事がなさそうだったので記載しておきます。


![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/037c26d1-73a6-cafa-cac7-860d80116f2b.gif)

## ボタンの同時タップ制御の実装
制御実装前のコード
```activty_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="32dp"
                android:text="Button1"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="32dp"
                android:text="Button2"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

```

実装方法は簡単で、同時タップを制御したいボタンの親のViewにこちらを追加します。


```diff_xml
  <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="0dp"
            android:layout_height="0dp"
+           android:splitMotionEvents="false"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <Button
                android:id="@+id/button1"
```


![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/082205eb-7669-5b74-c941-cbf6d6ce0108.gif)


## TabLayoutの同時タップ制御の実装
`TabLayout`のタブに対して制御を入れるとき、以下のように`tabLayout`内に`splitMotionEvents`をセットしても正しく動作しませんでした。

```.xml
<com.google.android.material.tabs.TabLayout
    android:id="@+id/mainTab"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:splitMotionEvents="false" // here
    app:tabIndicatorColor="@color/font_black"
    app:tabIndicatorHeight="2dp"
/>
```

こちらの記事を参考にFragment側で実装してあげるとTabLayout内でも同時タップの制御を実装できます。

https://stackoverflow.com/questions/32963376/disable-multi-touch-for-tabs-in-tablayout

```.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
        ~ 略　~
        
        (binding.mainTab.getChildAt(0) as ViewGroup).isMotionEventSplittingEnabled = false
}
```