Android View事件

14006 ワード

以上のタッチイベント、キーイベントとは異なり、各ビューに独自のアクティビティがあります.

ビューイベント処理構造


ビューイベント処理は이벤트 소스이벤트 핸들러に分けられ、イベントを処理するには리스너に接続する必要があります.
≪イベント・ソース|Event Source|ldap≫:イベントが発生したオブジェクト
≪イベント・ハンドラ|Event Handler|ldap≫:イベントが発生したときに実行する論理を含むオブジェクト
リスナー:イベント・ソースとイベント・ハンドラを関連付ける関数
構造はそうであるが、コードはイベントハンドラをイベントソースに登録する形式である.checkBoxイベントを見てみましょう.CompoundButtonクラスは次のインタフェースを定義しています.
 public static interface OnCheckedChangeListener {
        void onCheckedChanged(CompoundButton buttonView, boolean isChecked);
    }
このインタフェースで定義されているインタフェースはイベントハンドルです.イベントハンドラ内部で定義された関数onCheckedChanged(CompoundButton buttonView, boolean isChecked)を定義し、検査状態での動作を構成する.
次に、リスナーを定義し、対応するプロセッサにイベントソースを関連付ける方法を見てみましょう.
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.checkbox.setOnCheckedChangeListener { buttonView, isChecked ->
            if (isChecked) {
                Log.d("info", "Checked")
            } else {
                Log.d("info", "Not Checked")
            }
        }
    }
binding.checkboxはイベントソースであり、ビューから呼び出されたsetOnCheckedChangeListener {buttonView, isChecked -> ...} 関数はリスナーとしてロールを実行する.ここではSAM機能を利用しています.
以上の構成から,Activity自体がComponentButtonであることが分かる.OnCheckdChangeListenerを実装し、関連する関数を上書きする方法も使用できます.あるいは、いっそ別のクラスを作成して処理します.
class MainActivity : AppCompatActivity(), CompoundButton.OnCheckedChangeListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.checkbox.setOnCheckedChangeListener(this)
    }

    override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
        Log.d("info", "called")
    }
}

クリックとロングクリックイベントの処理


Androidには様々なビューがあり、各ビューには独自のイベントがあります.しかし,すべてのViewイベントは同じ処理構造を有しているため,イベントの処理は困難ではない.他のクリックを表示し、イベント処理を長クリックします.
2つのアクティビティのテナント構造は次のとおりです.ビューで定義されたOnClickListenerハンドルとOnLongClickListenerハンドルをそれぞれパラメータとして使用します.
open fun setOnClickListener(l: View.OnClickListener?): Unit
open fun setOnLongClickListener(l: View.OnLongClickListener?): Unit
各HandlerインタフェースはSAMを満たすための抽象的な方法しかない.
public interface OnClickListener {
        void onClick(View v);
    }

public interface OnLongClickListener {
        boolean onLongClick(View v);
    }
ここではリスナーのコードを直接実装し,LongClickはSAM方式,Clickはインタフェースを直接実装する方式で実装した.
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.myButton.setOnClickListener(View.OnClickListener { Log.d("info", "just tap") })
        binding.myButton.setOnLongClickListener {
            Log.d("info","Long tap")
            true
        }
    }
}

SAM (Single Abstract Method)


1つの方法で定義されたインタフェースのみが関数インタフェースまたはSAMインタフェースと呼ばれます.彼らがどれだけの実現方法を持っていても、1つの未実現の方法があれば、条件を満たしています.
Kotlinは次のように定義されています.インターフェースの特徴は、funキーワードが前に付いていることです.
fun interface IntPredicate {
   fun accept(i: Int): Boolean
}
lambda形式でsamを変換する機能を使用しない場合は、直接宣言して実装する必要があります.
val isEven = object : IntPredicate {
   override fun accept(i: Int): Boolean {
       return i % 2 == 0
   }
}
samの場合、lambda式に変換できるため、次の行に処理できます.
val isEven = IntPredicate { it % 2 == 0 } // SAM lambda 표현식은 맨 마지막 줄을 return 문으로 인식하게끔 되어있다.
チェックボックスハンドルを定義する場合、このオブジェクトはSAMであるため、lambda式が適用されます.