View.OnClickListener onClick() 點擊事件
View.OnLongClickListener onLongClick() 長按事件 .
View.OnFocusChangeListener onFoucusChange() 焦點改變事件
View.OnKeyListener onKey() 在某一個控件上的按鍵按下或鬆開的事件 .
View.OnTouchListener onTouch() 在某一個控件內的觸碰事件
View.OnCreateContextMenuListener onCreateContextMenu() 上下文菜單創建時調用,詳見Menu文檔
eg:
//實現一個OnClickListener的類
private OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
// do something當點擊按鈕的時候。
}
};
protected void onCreate(Bundle savedValues) {
//定位Button
Button button = (Button)findViewById(R.id.corky);
//註冊點擊監聽
button.setOnClickListener(mCorkyListener);
}
以上的方法中,其中有3個是有返回值的,如下:
onLongClick()
當返回true的時候,表示在這個方法中已經對這個事件進行了處理,而且event不會再進行傳遞
當返回false的時候,表示在這個方法中沒有對這個事件進行處理,event會繼續傳遞。
onKey() 同上
onTouch() 返回true,表示消費了這個事件
返回了false,表示對這個事件不感興趣。
對於key event,系統是從根視圖開始分發,直到到達目的控件,除此之外,
你還可以在Activity中的onKeyDown()和onKeyUp()方法中接收到所有的事件
Event Handlers:
在View對象中的處理事件的方法:
onKeyDown(int, KeyEvent) - Called when a new key event occurs.
onKeyUp(int, KeyEvent) - Called when a key up event occurs.
onTrackballEvent(MotionEvent) - Called when a trackball motion event occurs.
onTouchEvent(MotionEvent) - Called when a touch screen motion event occurs.
onFocusChanged(boolean, int, Rect) - Called when the view gains or loses focus.
以下幾個不是在View中的方法,但是直接影響到event的傳遞
Activity.dispatchTouchEvent(MotionEvent)
- 可以讓Activity 在事件傳遞到window之前,取攔截所有的觸摸事件
ViewGroup.onInterceptTouchEvent(MotionEvent)
- 讓ViewGroup去監聽event當把事件傳遞到子View的時候
ViewParent.requestDisallowInterceptTouchEvent(boolean)
- 通知父View不要使用onInterceptTouchEvent(MotionEvent)方法來攔截事件。
Touch Mode:
設備是可觸控時,一旦觸摸屏幕,設備就會進入到Touch Mode。
在這個模式下,只有isFocusableInTouchMode()返回true的時候,控件纔是focusable,例如EditText
但是返回false的時候,例如Button,就只會觸發點擊事件。
當使用其他的如滾動球等硬件按鈕時,設備就會退出Touch Mode,這時會找到一個控件來focus。
可以通過isTouchMode()來獲取當前設備的狀態。
Handling Focus:
isFocusable()
setFocusable()
isFocusableInTouchMode()
setFocusableInTouchMode()
focus動作是基於一個指定方位尋找最近的算法。
在罕見的情況下,默認的算法可能會不匹配開發者的行爲。在這時,可以使用以下的屬性:
nextFocusDown, nextFocusLeft, nextFocusRight,nextFocusUp
使用這些屬性在xml佈局中來指定(我想應該是不在Touch Mode下使用的吧)
eg:
<LinearLayout
android:orientation="vertical"
... >
<Button android:id="@+id/top"
android:nextFocusUp="@+id/bottom"
... />
<Button android:id="@+id/bottom"
android:nextFocusDown="@+id/top"
... />
</LinearLayout>
使用這兩個屬性在佈局中來指定控件的可focus性。
android:focusable
android:focusableInTouchMode
參考官方文檔的ui中的inputEvents