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は
  • を取得できない.
      /**
         * 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>