欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳細介紹Android中的視圖焦點Focus的使用

 更新時間:2018年01月11日 11:24:04   作者:歐陽大哥2013  
本篇文章主要介紹了詳細介紹Android中的視圖焦點Focus的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在非觸摸屏設備中接收事件和處理響應的控件是具有焦點(Focused)的控件。一個窗口中一個時間內只能有一個具有焦點的控件。在早期具有滾輪設備的android系統(tǒng)中以及現(xiàn)在的智能TV電視應用中視圖的焦點控制就非常重要了。而在觸摸設備上通常默認情況下只有EditText控件才具有焦點,而我們通常會遇到的一個問題就是當進入一個具有EditText的界面時鍵盤就會自動彈出,而且有時候可能無法消失,但需求可能是進入時不彈出鍵盤。而這些所有的東西都是和視圖的焦點有關,因此本文的重點就是介紹視圖的焦點屬性和方法,get到這些技術點后你就可以完全控制和使用這些特性了。

下面是幾個關于焦點特性的描述:

  1. ViewGroup中有一個mFocued成員來保存子視圖中哪個子視圖是具有焦點的視圖,并且這樣一直會遞歸下去。比如某個視圖層次下的根視圖ROOT下有A,B,C三個子視圖,而B下面又有B1,B2,B3三個子視圖,而這時候B3是具有焦點的子視圖,那么在B中的mFocued保存的是B3,而ROOT下的mFocued保存的是B。
  2. ViewGroup沒有焦點并不代表其子視圖也沒有焦點,這里沒有父子制約關系。
  3. 任何時候一個窗口內都只有一個視圖具有焦點,或者所有視圖都無焦點。
  4. 并不是所有視圖都可以獲取焦點。

我們要設置一個視圖是否可以獲取焦點可以通過如下方法來完成:

 //設置視圖是否可以獲得焦點
public void setFocusable(boolean focusable) 
//獲取視圖是否可以獲取焦點
public final boolean isFocusable() 

對于觸摸設備來說我們可以設置一個視圖在被觸摸時是否可以成為焦點視圖。我們可以通過如下方法:

//設置視圖是否在觸摸模式下可以獲得焦點 
 public void setFocusableInTouchMode(boolean focusableInTouchMode) 
 //獲取視圖是否在觸摸模式下獲得焦點
 public final boolean isFocusableInTouchMode() 

因此在觸摸設備下,一個視圖要想獲得焦點必須要setFocusable和setFocusableInTouchMode同時為true時才可以獲取焦點。

下面兩個方法用來判斷某個視圖是否是焦點視圖以及是否獲取了焦點:

//是否當前視圖就是焦點視圖
 public boolean isFocused() 
//當前視圖是否是焦點視圖,或者子視圖里面有焦點視圖。
public boolean hasFocus() 

hasFocus和isFocused區(qū)別主要在ViewGroup上,前者只要自己或者兒子視圖是焦點視圖都返回true,而后者是一定要自己是焦點視圖。

我們可以用如下方法來判斷視圖是否可見并且可以獲得焦點,如果自己不可獲得焦點則會遞歸調用子視圖判斷是否可以獲得焦點。 從上可見has和is的區(qū)別是是否是只判斷自身。

public boolean isFocusable(); //只判斷自身
public boolean hasFocusable();  //除了判斷自身外還判斷子視圖

如果我們要清除某個具有焦點視圖的焦點屬性就可以調用如下方法:

 public void clearFocus()

清除視圖的焦點時,會激發(fā)視圖的onFocusChanged的調用,并且往上遍歷調用clearChildFocus 將mFocued的值置空,然后再從根視圖中再次遍歷將某個最佳的視圖設置成為焦點視圖。因為清除某個視圖的焦點屬性時,系統(tǒng)為了保證擁有一個具有焦點的視圖,就會再次遍歷整個視圖樹來重新設置具有焦點的視圖。

下面的函數用來查找具有焦點的視圖,如果是View則判斷自己是否有焦點,如果是ViewGroup則自己就是焦點返回自己,否則返回兒子視圖里面的焦點視圖。如果都沒有焦點視圖時則返回null

public View findFocus() 

下面的方法是ViewGroup中的方法,獲取直接的焦點子視圖,也就是返回mFocued數據成員。

public View getFocusedChild() 

下面的方法中如果調用者是View并且自身可以獲取焦點,那么就將自身加入到views數組里面去,如果自身是ViewGroup則將里面的可獲取焦點的子視圖加入到views里面去。

public void addFocusables(ArrayList<View> views, int direction)

下面的方法可以獲取一個View或者ViewGroup下所有可獲取焦點的子視圖列表。如果調用的對象是View則可能返回自身,如果調用的對象是ViewGroup則返回自身和下面所有子視圖中可獲取焦點的子視圖。

//這里的direction參數貌似沒有什么作用。
 public ArrayList<View> getFocusables(int direction) 

可以看出addFocusables和getFocusables其實具有類似的功能,都是將自身或者容器視圖里面的子視圖中具有獲取焦點能力的子視圖返回到數組里面去。

public void setNextFocusDownId(int nextFocusDownId) 

上面函數和一些getXX函數用于設置或者獲取某個視圖的下一個焦點的ID,主要用于鍵盤模式來移動焦點的位置。

下面的方法用來請求成為當前焦點視圖。這個方法是視圖獲得焦點的關鍵:

public final boolean requestFocus() 

如果調用者是View且自己不可見(invisible or gone)或者不可獲得焦點(isFocusable為false)或者父視圖不允許自己獲取焦點就會返回false表示成為焦點視圖失敗。如果能夠成為焦點視圖,那么就會調用onFocusChanged方法清除其他焦點視圖。

如果是ViewGroup則根據setDescendantFocusability中的規(guī)則進行:如果是阻止子視圖則自己進行焦點的獲取,否則就按規(guī)則先子節(jié)點或者后子節(jié)點。

下面的方法用于當視圖是ViewGroup時的焦點獲取策略:

 public void setDescendantFocusability(int focusability) 

focusability可設置的值如下:

FOCUS_BLOCK_DESCENDANTS: 阻止子視圖成為焦點視圖,這樣即使子視圖調用了requestFocus也不能成為焦點視圖。

FOCUS_BEFORE_DESCENDANTS: 當ViewGroup調用requestFocus時總是優(yōu)先讓自己成為焦點視圖。

FOCUS_AFTER_DESCENDANTS: 當ViewGroup調用requestFocus時優(yōu)先讓里面的子視圖成為焦點,只有子視圖無法成為焦點時才讓自己成為焦點視圖。這個特性也是默認特性。

通過setDescendantFocusability和requestFocus方法的配合就可以解決那種只有一個EditText且一進入就自動鍵盤彈出的問題。因為默認的EditText是一個可成為焦點的視圖,這樣根據規(guī)則當界面展示時就會成為一個焦點視圖從而彈出鍵盤,這樣即使對EditText調用clearFocus也因為規(guī)則導致他還是焦點視圖。解決的方案是把EditText的一個祖先視圖也設置為可獲取焦點的視圖(setFocusable(true)),并且將這個祖先視圖的setDescendantFocusability設置為FOCUS_BEFORE_DESCENDANTS。這樣當對EditText調用clearFocus或者對祖先視圖調用reqeustFoucs時都會優(yōu)先讓祖先視圖獲得焦點。

視圖樹加載時的焦點視圖的遍歷

在窗口里的視圖第一次被裝載時系統(tǒng)會調用ViewRoot的doTraversal,這個函數內部會調用根視圖的requestFocus方法:

if (!mView.hasFocus()) {
          mView.requestFocus(View.FOCUS_FORWARD);
}

這樣就會讓系統(tǒng)的最葉子的某個視圖得到焦點。。得到的順序是順序為0的子視圖先得到焦點。

這里一個特殊的例子就是TextView即使設置了FocuableInTochMode,也沒有用,因為在構造函數中TextView自己的構造函數會在基類的基礎上再次判斷是否設置了Focuable屬性,如果沒有設置則即使上面設置FocuableInTochMode也沒有用。但是Button的Style里面是包括一個Foucable屬性的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android Presentation雙屏異顯開發(fā)流程詳細講解

    Android Presentation雙屏異顯開發(fā)流程詳細講解

    最近開發(fā)的一個項目,有兩個屏幕,需要將第二個頁面投屏到副屏上,這就需要用到Android的雙屏異顯(Presentation)技術了,研究了一下,這里做下筆記
    2023-01-01
  • Android studio制作簡易計算器功能

    Android studio制作簡易計算器功能

    這篇文章主要為大家詳細介紹了Android studio制作簡易計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android SQLite數據庫操作代碼類分享

    Android SQLite數據庫操作代碼類分享

    這篇文章主要介紹了Android SQLite數據庫操作代碼類分享,本文直接給出實現(xiàn)代碼和使用代碼,需要的朋友可以參考下
    2015-03-03
  • 如何利用matrix實現(xiàn)圖片倒影效果

    如何利用matrix實現(xiàn)圖片倒影效果

    利用matrix可以實現(xiàn)各種圖片的特效,比如圖片的旋轉、縮放、移動,甚至是圖片倒影效果,這篇文章為大家介紹了matrix實現(xiàn)圖片倒影的代碼,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android使用WebSocket實現(xiàn)多人游戲

    Android使用WebSocket實現(xiàn)多人游戲

    WebSocket 是 HTML5 一種新的協(xié)議。實現(xiàn)了瀏覽器與服務器全雙工通信,下面通過本文給大家分享Android使用WebSocket實現(xiàn)多人游戲,需要的朋友參考下吧
    2017-11-11
  • Android實現(xiàn)記住密碼小功能

    Android實現(xiàn)記住密碼小功能

    這篇文章主要為大家詳細介紹了Android實現(xiàn)記住密碼小功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android?完整購物商城界面的實現(xiàn)案例

    Android?完整購物商城界面的實現(xiàn)案例

    這篇文章為大家?guī)硪粋€Android?完整購物商城的界面具體的實現(xiàn),案例中含有商品列表的顯示,為商城最重要的功能之一,感興趣的朋友來看看吧
    2022-03-03
  • 使用Flutter 構建Web應用邏輯解析

    使用Flutter 構建Web應用邏輯解析

    這篇文章主要為大家介紹了使用Flutter 構建Web應用邏輯解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 解決android有的手機拍照后上傳圖片被旋轉的問題

    解決android有的手機拍照后上傳圖片被旋轉的問題

    這篇文章主要介紹了解決android有的手機拍照后上傳圖片被旋轉的問題的相關資料,需要的朋友可以參考下
    2016-09-09
  • Android自定義可標記日歷效果

    Android自定義可標記日歷效果

    這篇文章主要為大家詳細介紹了Android自定義可標記日歷效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評論