最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳細(xì)介紹Android中的視圖焦點(diǎn)Focus的使用

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

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

下面是幾個(gè)關(guān)于焦點(diǎn)特性的描述:

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

我們要設(shè)置一個(gè)視圖是否可以獲取焦點(diǎn)可以通過(guò)如下方法來(lái)完成:

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

對(duì)于觸摸設(shè)備來(lái)說(shuō)我們可以設(shè)置一個(gè)視圖在被觸摸時(shí)是否可以成為焦點(diǎn)視圖。我們可以通過(guò)如下方法:

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

因此在觸摸設(shè)備下,一個(gè)視圖要想獲得焦點(diǎn)必須要setFocusable和setFocusableInTouchMode同時(shí)為true時(shí)才可以獲取焦點(diǎn)。

下面兩個(gè)方法用來(lái)判斷某個(gè)視圖是否是焦點(diǎn)視圖以及是否獲取了焦點(diǎn):

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

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

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

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

如果我們要清除某個(gè)具有焦點(diǎn)視圖的焦點(diǎn)屬性就可以調(diào)用如下方法:

 public void clearFocus()

清除視圖的焦點(diǎn)時(shí),會(huì)激發(fā)視圖的onFocusChanged的調(diào)用,并且往上遍歷調(diào)用clearChildFocus 將mFocued的值置空,然后再?gòu)母晥D中再次遍歷將某個(gè)最佳的視圖設(shè)置成為焦點(diǎn)視圖。因?yàn)榍宄硞€(gè)視圖的焦點(diǎn)屬性時(shí),系統(tǒng)為了保證擁有一個(gè)具有焦點(diǎn)的視圖,就會(huì)再次遍歷整個(gè)視圖樹來(lái)重新設(shè)置具有焦點(diǎn)的視圖。

下面的函數(shù)用來(lái)查找具有焦點(diǎn)的視圖,如果是View則判斷自己是否有焦點(diǎn),如果是ViewGroup則自己就是焦點(diǎn)返回自己,否則返回兒子視圖里面的焦點(diǎn)視圖。如果都沒(méi)有焦點(diǎn)視圖時(shí)則返回null

public View findFocus() 

下面的方法是ViewGroup中的方法,獲取直接的焦點(diǎn)子視圖,也就是返回mFocued數(shù)據(jù)成員。

public View getFocusedChild() 

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

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

下面的方法可以獲取一個(gè)View或者ViewGroup下所有可獲取焦點(diǎn)的子視圖列表。如果調(diào)用的對(duì)象是View則可能返回自身,如果調(diào)用的對(duì)象是ViewGroup則返回自身和下面所有子視圖中可獲取焦點(diǎn)的子視圖。

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

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

public void setNextFocusDownId(int nextFocusDownId) 

上面函數(shù)和一些getXX函數(shù)用于設(shè)置或者獲取某個(gè)視圖的下一個(gè)焦點(diǎn)的ID,主要用于鍵盤模式來(lái)移動(dòng)焦點(diǎn)的位置。

下面的方法用來(lái)請(qǐng)求成為當(dāng)前焦點(diǎn)視圖。這個(gè)方法是視圖獲得焦點(diǎn)的關(guān)鍵:

public final boolean requestFocus() 

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

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

下面的方法用于當(dāng)視圖是ViewGroup時(shí)的焦點(diǎn)獲取策略:

 public void setDescendantFocusability(int focusability) 

focusability可設(shè)置的值如下:

FOCUS_BLOCK_DESCENDANTS: 阻止子視圖成為焦點(diǎn)視圖,這樣即使子視圖調(diào)用了requestFocus也不能成為焦點(diǎn)視圖。

FOCUS_BEFORE_DESCENDANTS: 當(dāng)ViewGroup調(diào)用requestFocus時(shí)總是優(yōu)先讓自己成為焦點(diǎn)視圖。

FOCUS_AFTER_DESCENDANTS: 當(dāng)ViewGroup調(diào)用requestFocus時(shí)優(yōu)先讓里面的子視圖成為焦點(diǎn),只有子視圖無(wú)法成為焦點(diǎn)時(shí)才讓自己成為焦點(diǎn)視圖。這個(gè)特性也是默認(rèn)特性。

通過(guò)setDescendantFocusability和requestFocus方法的配合就可以解決那種只有一個(gè)EditText且一進(jìn)入就自動(dòng)鍵盤彈出的問(wèn)題。因?yàn)槟J(rèn)的EditText是一個(gè)可成為焦點(diǎn)的視圖,這樣根據(jù)規(guī)則當(dāng)界面展示時(shí)就會(huì)成為一個(gè)焦點(diǎn)視圖從而彈出鍵盤,這樣即使對(duì)EditText調(diào)用clearFocus也因?yàn)橐?guī)則導(dǎo)致他還是焦點(diǎn)視圖。解決的方案是把EditText的一個(gè)祖先視圖也設(shè)置為可獲取焦點(diǎn)的視圖(setFocusable(true)),并且將這個(gè)祖先視圖的setDescendantFocusability設(shè)置為FOCUS_BEFORE_DESCENDANTS。這樣當(dāng)對(duì)EditText調(diào)用clearFocus或者對(duì)祖先視圖調(diào)用reqeustFoucs時(shí)都會(huì)優(yōu)先讓祖先視圖獲得焦點(diǎn)。

視圖樹加載時(shí)的焦點(diǎn)視圖的遍歷

在窗口里的視圖第一次被裝載時(shí)系統(tǒng)會(huì)調(diào)用ViewRoot的doTraversal,這個(gè)函數(shù)內(nèi)部會(huì)調(diào)用根視圖的requestFocus方法:

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

這樣就會(huì)讓系統(tǒng)的最葉子的某個(gè)視圖得到焦點(diǎn)。。得到的順序是順序?yàn)?的子視圖先得到焦點(diǎn)。

這里一個(gè)特殊的例子就是TextView即使設(shè)置了FocuableInTochMode,也沒(méi)有用,因?yàn)樵跇?gòu)造函數(shù)中TextView自己的構(gòu)造函數(shù)會(huì)在基類的基礎(chǔ)上再次判斷是否設(shè)置了Focuable屬性,如果沒(méi)有設(shè)置則即使上面設(shè)置FocuableInTochMode也沒(méi)有用。但是Button的Style里面是包括一個(gè)Foucable屬性的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android自定義上下左右間隔線

    Android自定義上下左右間隔線

    這篇文章主要為大家詳細(xì)介紹了Android自定義上下左右間隔線,自定義SpaceItemDecoration分割線,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android搭建本地Tomcat服務(wù)器及相關(guān)配置

    Android搭建本地Tomcat服務(wù)器及相關(guān)配置

    這篇文章主要介紹了Android搭建本地Tomcat服務(wù)器及相關(guān)配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android 是如何捕捉 java 異常的

    Android 是如何捕捉 java 異常的

    這篇文章主要介紹Android 是如何捕捉 java 異常的,他是怎么實(shí)現(xiàn)全局捕捉的,帶著這樣的疑問(wèn)和小編一起閱讀下面文章的具體內(nèi)容吧
    2021-09-09
  • Android應(yīng)用開發(fā)工程目錄作用介紹

    Android應(yīng)用開發(fā)工程目錄作用介紹

    這篇文章主要介紹了Android應(yīng)用開發(fā)工程目錄作用介紹,本文對(duì)Android項(xiàng)目中的每個(gè)目錄的作用作了總結(jié),需要的朋友可以參考下
    2014-10-10
  • Android 5.0 實(shí)現(xiàn)水波擴(kuò)散效果

    Android 5.0 實(shí)現(xiàn)水波擴(kuò)散效果

    這篇文章主要為大家詳細(xì)介紹了Android 5.0 實(shí)現(xiàn)水波擴(kuò)散效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android小組件添加到主屏幕(手機(jī)桌面)的方法實(shí)例

    Android小組件添加到主屏幕(手機(jī)桌面)的方法實(shí)例

    很多在多年前使用過(guò)Android手機(jī)的朋友,可能對(duì)于Android 4.0時(shí)代盛行的桌面小組件功能有著很深的印象,下面這篇文章主要給大家介紹了關(guān)于Android小組件添加到主屏幕(手機(jī)桌面)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • android自動(dòng)化測(cè)試知識(shí)點(diǎn)總結(jié)

    android自動(dòng)化測(cè)試知識(shí)點(diǎn)總結(jié)

    在本文里小編給大家分享了關(guān)于android自動(dòng)化測(cè)試入門的相關(guān)知識(shí)點(diǎn),需要的朋友們跟著參考下吧。
    2019-06-06
  • Android動(dòng)畫系列之屬性動(dòng)畫的基本使用教程

    Android動(dòng)畫系列之屬性動(dòng)畫的基本使用教程

    這篇文章主要給大家介紹了關(guān)于Android動(dòng)畫系列教程之屬性動(dòng)畫的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • android耳機(jī)左右聲道接反具體修正方法

    android耳機(jī)左右聲道接反具體修正方法

    android 耳機(jī)左右聲道接反如何修正,具體的修改方法如下,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助
    2013-06-06
  • Kotlin線程的橋接與切換使用介紹

    Kotlin線程的橋接與切換使用介紹

    這篇文章主要介紹了Android開發(fā)中Kotlin線程的橋接與切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論

沂水县| 色达县| 茶陵县| 九寨沟县| 中卫市| 汕头市| 会泽县| 农安县| 安达市| 泽州县| 崇信县| 江川县| 金阳县| 镶黄旗| 北碚区| 临泽县| 黔西县| 离岛区| 潞城市| 紫金县| 犍为县| 南乐县| 双峰县| 昌吉市| 仁怀市| 从化市| 潍坊市| 项城市| 台中县| 海原县| 雷波县| 象山县| 梁山县| 南川市| 化德县| 那曲县| 阜康市| 常宁市| 西畴县| 岫岩| 江川县|