即興的靈感

          思維是一種藝術; 藝術需要靈感。

          博客好友

          最新評論

          Android開發中的UI事件監聽處理機制總結

          在Android平臺上,捕獲用戶在界面上的觸發事件有很多種方法,View類就提供這些方法。你在使用各種View視圖來布局界面時,會發現幾個公用的回調方法來捕捉有用的UI觸發事件,當事件在某個View對象上被觸發時,這些方法會被系統框架通過這個對象所調用,例如:當一個View(如一個Button)被點擊,onTouchEvent()方法會在該對象上被調用,所以,為了捕獲和處理事件,必須去繼承某個類,并重載這些方法,以便自己定義具體的處理邏輯,顯然,你更容易明白,為什么在你使用View類時會嵌套帶有這些回調方法的接口類,這些接口稱為event listeners,它是你去獲取UI交互事件的工具在你繼承View類,以便建立一個自定義組,也許你想繼承Button,你會更普遍使用事件監聽來捕捉用戶的互動,在種情況下,你可以使用類的event handlers.來預定義事件的處理方法。

              View類里的event listener是一個帶有回調方法的接口,當UI里的組建是被用戶觸發時,這些方法會被系統框架所調用。
              1.onClick()來自View.OnClickListener 它會被調用當點擊這個Item(在觸摸模式),或者當光標聚集在這個Item上時按下“確認”鍵 ,導航鍵,或者軌跡球。
              2.onLongClick()來自View.OnLongClickListener.  它會被調用當長按這個Item(在觸摸模式),或者當光標聚集在這個Item上時長按 “確認”鍵 ,導航鍵,或者軌跡球。
              3.onFocusChange()來自View.OnFocusChangeListener 它會被調用當光標移到或離開這個Item,
              4.onKey()來自View.OnKeyListener..它會被調用,當光標移到這個Item,按下和釋放一個按鍵的時候
              5.onTouch()來自View.OnTouchListener. 它會被調用 ,在這個Item的范圍內點觸的時候
              6.onCreateContextMenu()來自View.OnCreateContextMenuListener. 在長按時候會被調用。
           
              這些方法和嵌套接口類都是一一對應的,如果確定其中一種方法處理你的互動事件,你需要在Activity中實現這個帶有這個方法的接口,并把它作為匿名類,然后,通過實例的View.setXxxListener() 方法來設置監聽器(例如,調用setOnClickListener(),來設置OnClickListener做為監聽器)

              下面是為一個按鈕設置監聽器的例子:
              //實現OnClickListener接口并實現onClick方法
              private OnClickListener mCorkyListener = new OnClickListener() {
              public void onClick(View v) {
              }
             };
             
              //為按鈕注冊事件監聽器
              protected void onCreate(Bundle savedValues) {
              Button button = (Button)findViewById(R.id.corky);
              button.setOnClickListener(mCorkyListener);
             }

              下面這個列子我們會發現用Activity去實現OnClickListener接口,并作為它的一部分,會更方便,而不必去加載額外的類和對象
              //在集成Activity的子類中直接實現監聽接口
              public class ExampleActivity extends Activity implements OnClickListener {
              protected void onCreate(Bundle savedValues) {
                  Button button = (Button)findViewById(R.id.corky);
                  button.setOnClickListener(this);
              }
           
              public void onClick(View v) {
                //事件處理
                }
              }

              這里注意一下,以上的例子可以看出onClick()是沒有返回值的,但是有些事件處理方法是必須帶返回值,它取決于的具體的事件,有些那么做的原因,看下面的例子:
              onLongClick()它返回的布爾值表明你已經完成了這個事件的處理,還是應該把它繼續傳下去。返回true表明已經處理完成并且停止了傳遞,如果返回為false表明事件還沒有完成,或者它還需要繼續被傳遞給其他的監聽器。

              onKey()它返回的布爾值表明你已經完成了這個事件的處理,還是應該把它繼續傳下去。返回true表明已經處理完成并且停止了傳遞,如果返回為false表明事件還沒有完成,或者它還需要繼續被傳遞給其他的監聽器。

              onTouch()它返回的布爾值表明你是否已經完成了這次事件的行動,重要的是后面可能還有很多后續的行動,這樣,如果你返回false,表明在接到下一次的后續行動中,你還沒有完成之前行為也沒有意向去處理隨后的行動,因此,在這個事件的后續行動中將不會再被調用。 如fingure手勢,或最終行動事件。

              記住:我們所關注的事件肯定是發生在高亮聚集的焦點,它從總視圖(頂級的)被一級一級的向下傳遞,直到我們想要關注的組件,當焦點聚集在這個視圖(或視圖中的子視圖)時 ,你能夠使用dispatchKeyEvent() 作為一種代替方法,來捕獲在視圖上的按鍵事件,你還可以使用onKeyDown()和onKeyUp().來捕獲所有事件內的交互活動

              注意:在 Android 框架中會調用event handlers先處理事件,然后會適當的傳遞給二級默認的預定義handlers中;因此 如果返回true,將會停止這個事件的傳遞,View中默認事件處理方法的回調也會被阻止。因此,當你返回true肯定表明你是要終止這個事件的延續。

          如果您建立一個繼承于View自定義組件,然后您可以定義一些回調方法用作默認的事件處理程序。該文件中關于Building Custom Components,您會學習一些共用的回調方法用于事件處理,其中包括:
              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.
           
              當用戶在使用方向鍵或軌跡球瀏覽用戶界面時,有必要給于一個焦點在可操作的組件上(如一個Button),使用戶可以看到它將接受輸入命令。如果設備有觸摸功能,那么,當用戶與界面的交互就不再需要有一個高亮在組件上,或一個焦點在view上,因此,模式的互動名為”觸摸模式”。對于一個觸摸設備,一旦有用戶接觸屏幕時,該設備將進入觸摸模式.在點觸某個View后,只有的它的方法isFocusableInTouchMode()返回為真時,才會有聚集焦點,如文本編輯工具。其他的界面只可以點觸,但不會聚集焦點(高亮),如button 被點觸時就不會聚集焦點,當它被按下時只會調用on-click監聽器的回調方法。

              任何時候用戶接觸方向鍵或者滾動軌跡球時,該設備將退出觸摸模式,并聚集焦點,用戶可以恢復與用戶界面的鍵盤交互,而不必在屏幕上。觸摸模式的狀態是由整個系統來維持的(all windows and activities),要查詢目前所處的狀態,你可以調用isInTouchMode()方法來獲得,看看設備目前是否處于觸摸模式。

              系統框架將處理日常的焦點移動來響應用戶的輸入,它包刮改變焦點(當界面是被移除,隱藏,或者作為一個新的View變為可用狀態),通過isFocusable()這個方法我們可以知道view是否具有接受焦點的資格,也可以通過setFocusable().來設置view接受焦點的資格,對應在觸摸模式下,你可以調用isFocusableInTouchMode().來獲知是否有焦點來響應點觸,也可以通過setFocusableInTouchMode().來設置是否有焦點來響應點觸的資格.

              系統框架控制焦點移動到另一個組件的算法是在某一方向上鄰近的組件,在極個別情況下,默認的算法可能不符合開發者的預想要求,在這種情況下,你可以覆寫下列XML屬性的布局文件(nextFocusDown,nextFocusLeft,nextFocusRight,nextFocusUp)設置他們的值來明確焦點從當前界面移動下個界面的Id。例如:
              <LinearLayout
              android:orientation=”vertical”
              >
              <Button android:id=”@+id/top”
                android:nextFocusUp=”@+id/bottom”
                />
              <Button android:id=”@+id/bottom”
                    android:nextFocusDown=”@+id/top”
                />
              </LinearLayout>

              一般來說,在這個垂直布局,瀏覽的焦點會從第一個按鈕開始,不會是從第二個或者其他的,現在topButtont已經通過nextFocusUp (反之亦然)確定了bottom.

              通常如果你想宣布用戶界面具有焦點的資格 (如果這個界面在傳統上是沒有的),可以在xml布局里去加上的android:focusable的屬性,并設置它的值,您也可以宣布在觸摸模式下具有焦點的資格,同樣也只在xml里添android:focusableInTouchMode.的屬性,并設置它的值. 當用戶請求在某個界面聚集焦點時,會調用requestFocus().這個方法。監聽到焦點活動(獲得焦點或失去焦點都會被通知),會調用onFocusChange(),這個方法,這也是上面所討論的Event Listeners。

              總結:
              對于UI控件事件的處理,需要設定相應的監聽器,并實現相應的事件處理程序。這兒有兩種實現方法:一是定義一個OnClickListener 類的實例,并使用setOnClickListener等綁定監聽器;二是用Activity去實現OnClickListener接口,并作為它的一部分,這樣會更方便,省去了加載額外的類和對象的時間。
          對于支持觸摸屏的手機,可以設定觸摸模式的UI,可以使用isInTouchMode()來獲得觸摸模式的狀態。
             
              UI處理的另一個重點是焦點的設定及其切換。焦點設置:通過setFocusable或者setFocusableInTouchMode設置可以接受焦點,通過isFocusable或isFocusableInTouchMode獲取是否可以接受焦點;焦點切換:編寫XML布局文件的nextFocusDown 等屬性設置。文章地址



          ?
          鳳凰涅槃/浴火重生/馬不停蹄/只爭朝夕
          ???? 隱姓埋名/低調華麗/簡單生活/完美人生

          posted on 2010-04-15 17:58 poetguo 閱讀(4481) 評論(0)  編輯  收藏 所屬分類: Android

          主站蜘蛛池模板: 抚松县| 武城县| 比如县| 三门县| 聂拉木县| 宜兴市| 五家渠市| 稻城县| 吉木萨尔县| 门源| 汉川市| 北京市| 柘荣县| 沂南县| 长寿区| 金阳县| 乌鲁木齐县| 平度市| 嵊泗县| 汾阳市| 玛曲县| 秦安县| 买车| 南开区| 饶平县| 沅江市| 高邮市| 日照市| 社会| 马山县| 永吉县| 宽城| 从化市| 铁岭县| 高密市| 会理县| 芮城县| 洪湖市| 志丹县| 于田县| 长丰县|