Activityのボタンメッセージング
6417 ワード
どのように呼び出すかは分かりませんが、activityのボタンメッセージに注目しましょう.
acitivtyには、キーメッセージ処理に関する3つの方法がある.义齿ActivityはViewのサブクラスであるため、この3つの方法はいずれもViewを書き換える3つの方法である.
の文を参照します.
キーメッセージがactivityの内部に入ると、Activity内部のdispatchKeyEventにはデフォルトの論理処理がある.Activity保証のwindowオブジェクトの対応するメソッドをコールバックし、DecorViewオブジェクトのビュー内にメッセージを送信します.その後、Activity内部のonKeyDown()とonKeyUp()関数をコールバックします.アプリケーションがdispatchKeyEvent()をリロードし、デフォルトの論理に従って処理しない場合、キーメッセージがView数の内部のビューに渡されない可能性があるため、一般的には関数はリロードされません.では、キーメッセージがactivityの内部に入ると説明する.すべてのボタンのメッセージがactivityに入るわけではない.ホームキーを挙げるとできません.これは下層から配布される. 上記のようにdispatchKeyEvent()をリロードすると、dispatchKeyEventではいくつかのキーに対してsuperが呼び出されない.dispatchKeyEvent,onKeyDown,onKeyUpは呼び出されません.どうして?Activity dispatchKeyEventを介してキーの配布が行うため、onKeyDown,onKeyUpに配布される. Activityでsuperが呼び出された.dispatchKeyEventは、ViewでActivityから派遣されたボタンメッセージを入手できますか?答えは?ソースコードにおいてActivityのWindow内を経由するメッセージフィルタリングを行い、フィルタリングしたメッセージをViewに配信する.例えば、戻りキーViewは を取得できない.
次はいくつかのテストコードです.
MainAcitivty.java
layout.xml
acitivtyには、キーメッセージ処理に関する3つの方法がある.义齿ActivityはViewのサブクラスであるため、この3つの方法はいずれもViewを書き換える3つの方法である.
キーメッセージがactivityの内部に入ると、Activity内部のdispatchKeyEventにはデフォルトの論理処理がある.Activity保証のwindowオブジェクトの対応するメソッドをコールバックし、DecorViewオブジェクトのビュー内にメッセージを送信します.その後、Activity内部のonKeyDown()とonKeyUp()関数をコールバックします.アプリケーションがdispatchKeyEvent()をリロードし、デフォルトの論理に従って処理しない場合、キーメッセージがView数の内部のビューに渡されない可能性があるため、一般的には関数はリロードされません.
/**
* Called to process key events. You can override this to intercept all
* key events before they are dispatched to the window. Be sure to call
* this implementation for key events that should be handled normally.
*
* @param event The key event.
*
* @return boolean Return true if this event was consumed.
*/
public boolean dispatchKeyEvent(KeyEvent event) {
onUserInteraction();
Window win = getWindow();
if (win.superDispatchKeyEvent(event)) {
return true;
}
View decor = mDecor;
if (decor == null) decor = win.getDecorView();
return event.dispatch(this, decor != null
? decor.getKeyDispatcherState() : null, this);
}
次はいくつかのテストコードです.
MainAcitivty.java
package com.example.qiang.mykeyaction;
import android.app.Activity;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
public static final String TAG ="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button but = (Button) findViewById(R.id.but);
but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this , "asdfdsf" ,Toast.LENGTH_SHORT).show();
}
});
MyView myView = (MyView) findViewById(R.id.myView);
myView.setFocusable(true);
}
/* activity , activity , : , home,back,menu 。
: statubar, , , .*/
@Override
public void onUserInteraction() {
super.onUserInteraction();
// Log.d(TAG ,"onUserInteraction");
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d(TAG ," onKeyDown keyCode = "+keyCode );
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Log.d(TAG ,"onKeyUp keyCode = "+keyCode );
return super.onKeyUp(keyCode, event);
}
//
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// dispatchKeyEvent onKeyDown ,onKeyUp
// return false;
// return true;
return super.dispatchKeyEvent(event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(" ");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
}
package com.example.qiang.mykeyaction;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
/** MotionEven
* Created by qiang on 15/5/9.
*/
public class MyView extends View {
public static final String TAG ="MyView";
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d(TAG, "onKeyDown keyCode = " + keyCode);
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Log.d(TAG, "onKeyUp keyCode = " + keyCode);
return super.onKeyUp(keyCode, event);
}
}
layout.xml
<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" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView android:text="@string/hello_world" android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<Button
android:id="@+id/but"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="123"
/>
<com.example.qiang.mykeyaction.MyView
android:id="@+id/myView"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@android:color/background_dark"
/>
</LinearLayout>
</RelativeLayout>