コールバックベースのイベント処理メカニズム


このセクションの紹介

3.1 では、Android のイベント処理メカニズム、つまりリスニングに基づくイベント処理メカニズムについて学習しました。 イベント ソース (コンポーネント) にリスナーを追加すると、ユーザーがイベントをトリガーすると、さまざまなイベントに従って、イベントがリスナーに渡されて処理されます。 さまざまな操作を実行します。では、コールバックベースのイベント処理メカニズムの原理は何でしょうか?さて、もう 1 つの質問: 知っていましたか? メソッドコールバックとは何ですか?あなたは知っていますか?多くの友人はそれを知っていると思いますが、それを表現することができません。さて、これらの質問については、 Androidのイベント処理機構のコールバックイベント処理機構を解析してみましょう!


1. メソッドコールバックとは何ですか?

テキストの説明:

回答: これは、関数定義と関数を分離する手段であり、分離の設計思想です。Java では、コールバックはインターフェイスを介して実装されます。 システム アーキテクチャとして、独自のオペレーティング環境を備え、実装は顧客に依存するため、ユーザーに実装インターフェイスを提供する必要があります。 統一されたインターフェイスとさまざまな実装を実現するために、システムは実装クラスをさまざまな状態で「コールバック」することによってインターフェイスと実装の分離を実現します。

簡単な例:

例: あなたは金曜日に学校から帰ってきて、お母さんにご飯は炊けたかと尋ねると、お母さんはまだ炊けていないと言った。あなたは彼女にこう言いました。 お母さん、楽しいヤギを見てください。ご飯を炊いたら、私に電話してください。あなたとあなたのお母さんは、このインターフェースを通してお母さんにご飯を作るように頼みました。 また、このインターフェイスを通じて「ご飯が炊きました」というフィードバックも表示されます。

2. Android コールバック イベント処理メカニズムの詳細な説明:

Android にはコールバック ベースのイベント処理メカニズムの 2 つの使用シナリオがあります:

1) カスタム ビュー

ユーザーが GUI コンポーネントでイベントを起動するときコンポーネントに独自のメソッドがある場合、コンポーネントがイベントの処理を担当します。 一般的な使用法: 基本的な GUI コンポーネントを継承し、コンポーネントのイベント処理メソッドを書き換えます。つまり、ビューをカスタマイズします。 注: XML レイアウトでカスタム ビューを使用する場合は、「完全修飾クラス名」を使用する必要があります。

共通の View コンポーネントのコールバック メソッド:

Android は、View を使用して GUI コンポーネント用のイベント処理コールバック メソッドをいくつか提供します。例えば、以下のような方法があります

①このコンポーネントで画面イベントをトリガーする: boolean onTouchEvent(MotionEvent event);
②このコンポーネントでボタンが押されたとき: boolean onKeyDown(int keyCode,KeyEvent event);
③コンポーネントを放す コンポーネント上のボタンが押されたとき押下時: boolean onKeyUp(int keyCode,KeyEvent event);
④コンポーネントのボタン長押し時: boolean onKeyLongPress(int keyCode,KeyEvent event);
⑤キーボードショートカットイベント発生: boolean onKeyShortcut(int keyCode,KeyEvent イベント);
⑥コンポーネント上でトラックボール画面イベントをトリガーします: boolean onTrackballEvent(MotionEvent イベント);
*⑦コンポーネントのフォーカスが変更されたとき、このメソッドは前の 6 つとは異なります。ビュー! protected void onFocusChanged(boolean GainFocus, int direct, Rect before FocusedRect)

さらに、これはトラックボールとは何かを説明していますが、以前の BlackBerry 携帯電話ではあまり役に立ちません。いつ トラックボールをマウスと考えることができますが、この操作は onTouchEvent を使用して解決できますが、十分に美しいものではないので、ここで これは非常に便利ですが、基本的には必要ありません。興味があり、見たい場合は、元の Android エミュレーターで f6 キーを押して確認できます

1.png

コード例: Button クラスを継承するように MyButton クラスをカスタマイズします。 、次に onKeyLongPress メソッドをオーバーライドします。 次に、xml ファイル内の完全修飾クラス名を使用して、カスタマイズされたビューを呼び出します

レンダリングは次のとおりです:

2.jpg

単純なボタン、ボタンをクリックした後、およびボタンを押すと、onTouchEvent イベントがトリガーされます。シミュレーター時間のキーボード、 onKeyDown イベントは押されたときにトリガーされ、onKeyUp イベントはキーボードから離れるときにトリガーされます。 Logcatで確認してみましょう!

3.jpg

実装コード: MyButton.java

public class MyButton extends Button{
private static String TAG = "haha";
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs) }

// キーボードの押下によってトリガーされるトリガーを書き換えますイベント
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode,event); Log.i(TAG, "onKeyDown メソッドが呼び出されました"); return true;
}

/ /オーバーライドキーボードのポップアップによってトリガーされるイベント
@Override public boolean onKeyUp(int keyCode, KeyEvent event) {
super.onKeyUp(keyCode,event); Log.i(TAG, "onKeyUp メソッドが呼び出されます" ); true を返します。 }

//コンポーネントがタッチされました
@Override
public boolean onTouchEvent(event)
Log. i(TAG,"onTouchEvent メソッドが呼び出されました")
return true;
}

レイアウト ファイル:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools "
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyActivity">

<example.jay.com.mybutton.MyButton
and roid:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>

コード分析:

Button の 3 つのコールバック メソッドを直接オーバーライドしているため、クリック イベント発生時に必要ありませんJava ファイルで実行します イベント リスナーのバインディングはコールバックを完了できます。つまり、コンポーネントは対応するイベントを処理します。つまり、イベントはイベント ソース (コンポーネント) 自体によって処理されます。


2) コールバックベースのイベント伝播:

4.jpg

要約すると、外部に伝播するかどうかは、メソッドの戻り値が true か false かによって決まります。

コード例:

public。 class MyButton extends Button{
private static String TAG = "haha";
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs) }

// キーボードの押下によってトリガーされるイベントを書き換えます
@Override
public boolean onKeyDown(int keyCode, KeyEventevent) {
super.onKeyDown(keyCode,event);
return false
}
}

main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/ tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyActivity">  

<example.jay.com.mybutton.MyButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自定义按钮"
android:id="@+id/btn_my "/>  
</LinearLayout>

MainActivity.java:

public class MyActivity extends ActionBarActivity {
@Override
protected onCreate(Bundle savedInstanceState) {
super.onCreate(savedIn)スタンス状態);  
setContentView(R.layout.activity_my);  

ボタン btn = (ボタン)findViewById(R.id.btn_my);  
btn.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN)
{
Log.i ("呵呵","监听器のonKeyDownメソッド被调用");
}
return false;
});  
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);  
Log.i("呵呵","ActivityのonKeyDownメソッド被调用");  
false を返します。  
}
}

実行中のスクリーンショット:

5.jpg

結果分析: 上記の実行結果から、伝播の順序は次のとおりであることがわかります: Listener--->View コンポーネント コールバック メソッド--->Activity コールバック メソッド;


このセクションの概要

Androidのイベント処理機構におけるコールバックベースのイベント処理機構について解説します!中心となるのはイベントの伝播順序です リスナーが優先され、次に View コンポーネント自体が優先され、最後にアクティビティが優先されます。戻り値 false は伝播を継続し、true は伝播を終了します。