日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android中最详细的焦点问题,从概念出发带你一点点分享(1)

發(fā)布時間:2023/12/15 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中最详细的焦点问题,从概念出发带你一点点分享(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章最早發(fā)布于我的微信公眾號 Android_De_Home 中,歡迎大家掃描下面二維碼關(guān)注微信公眾獲取更多知識內(nèi)容。
本文為sydMobile原創(chuàng)文章,可以隨意轉(zhuǎn)載,但請務(wù)必注明出處!

今天寫的這篇博客主要是針對在Android中的焦點問題,網(wǎng)上有很多關(guān)于焦點博客文章,但是大多數(shù)都是不全的,要么就是直接分析源碼,要么就是直接講遇到什么問題怎么解決,總之不夠全面。往往導(dǎo)致我們看完一篇博客后只是會了怎么解決那個問題,對什么是焦點還是說不出來,遇到問題還是解決不了。這也是我寫這篇博客的主要原因。這篇博客從最簡單的概念說起,然后一點點分享源碼,讓你可以對焦點不再模棱兩可。

焦點概念

焦點在Android中也就是Focus,稱為Focus機制。以后我們看到Focus就是指的焦點!那么什么是焦點機制呢?或者什么是焦點呢?
概念:所謂焦點就和我們生活中一樣,比如你的同學(xué)聚會中,誰是焦點啊。其實意思差不多,焦點就是最受關(guān)注的哪一個,人們都圍繞著它。再來回到我們Android開發(fā)中,比如一個頁面有3個EditText,那么當(dāng)你鍵盤輸入內(nèi)容的時候,這個時候會在哪一個EditText里面顯示內(nèi)容呢?這個時候就是誰獲得了焦點就在那個EditText中顯示內(nèi)容。(注意:有很多人把焦點和點擊混了,以為我點擊了某個控件,這個控件就獲取焦點了,這個是不一定的,不能這么認(rèn)為!后面會有說明)

說白了就是你手機當(dāng)前屏幕上的焦點在那個控件上,體現(xiàn)就是當(dāng)前控件獲取了焦點,對于EditText來說,體現(xiàn)就是鍵盤輸入的內(nèi)容,會輸入到這個EditText上面。如果這個EditText沒有獲取焦點的話,鍵盤輸入的內(nèi)容是不會在EditText內(nèi)顯示的。

獲取焦點的兩種模式

觸摸模式(TouchMode)與普通模式

用代碼的體現(xiàn)就是:如果請求有觸摸獲取焦點的能力,在xml中的配置是 android:focusableInTouchMode="true"
請求有普通獲取焦點的能力(可以理解為通過物理鍵盤),在xml中的配置是android:focusable="true"
具體的來說說這兩種模式:

  • focusable

出現(xiàn)這種模式主要是因為Android系統(tǒng)不僅僅是針對手機的,有可能在電視、手表等等的非觸摸輸入設(shè)備上。在手機上其實普通模式很少用了,現(xiàn)在的手機基本都是觸摸屏并且沒有物理上下鍵的,這種模式是用在TV等一些有物理鍵的產(chǎn)品上面的。比如非觸摸屏手機或者TV,如果設(shè)置為true,則鍵盤上下左右選中,焦點會隨之移動。比如有物理上下鍵,你按一個向下鍵,屏幕上的內(nèi)容就會對應(yīng)選中一個向下的控件,如果這個控件有focusable能力的話這個時候這個控件就是獲得了焦點。

  • focusableInTouchMode

在Android開發(fā)中對于現(xiàn)在的手機來說,都是觸摸模式(TocuMode),就是當(dāng)你觸摸一個控件的時候,這個控件會獲取焦點。注意:有些控件是默認(rèn)不具有觸摸獲取焦點的功能的(Button、TextView、LinearLayout等等這些控件是默認(rèn)沒有觸摸獲取焦點功能的,為什么會有這種問題呢?原因是這些控件有時候可能會想要先響應(yīng)點擊事件,如果觸摸獲取焦點功能打開后,當(dāng)你點一下,默認(rèn)是不會調(diào)用點擊事件的,這個時候會先讓這個控件獲取焦點)EditText是默認(rèn)有觸摸獲取焦點功能的,并將第一搶先獲取焦點。這就解釋了為什么當(dāng)一個頁面有EditText的時候,我們進入的時候默認(rèn)有光標(biāo),鍵盤彈出,這就是焦點在這EditText上面。
就像上面說的那些控件(Button、TextView等等這些默認(rèn)沒有觸摸獲取焦點功能的控件),當(dāng)你點擊它的時候,它也不會獲取焦點也就是調(diào)用 isFocused()方法的時候返回的也是false,這個時候默認(rèn)的是觸發(fā)到它的點擊事件。如果你配置了focusableInTouchMode的話這個時候這些控件才會獲取焦點,而這個時候是不會觸發(fā)點擊事件的,觸發(fā)的是 OnFocusChangeListener。這個時候獲取了焦點,當(dāng)你在點擊的時候才會觸發(fā)點擊事件。

總結(jié):這兩個屬性都是表示是否可以獲取焦點,focusableInTouchMode是針對觸屏的。 android:focusable是針對有物理鍵下操作的。我們在Android開發(fā)中主要是用focusableInTouchMode。

分析一下為什么出現(xiàn)EditText自動獲取焦點的問題

我們都知道如果在布局中有EdiText的話,EditText會默認(rèn)獲得焦點,彈出鍵盤。解決方法網(wǎng)上也很多了,就是在EditText的父布局中添加 focusableInTouchMode = true 。網(wǎng)上大多數(shù)會添加focusable = true。我們通過上面的內(nèi)容可以知道,對于手機來說,只需要添加 focusableInTouchMode = true 就可以了。
EditText自動獲取焦點主要是因為當(dāng)我們沒有給EditText的父布局設(shè)置focusableInTouchMode的時候,它的父布局是默認(rèn)沒有這個能力的,所以焦點就會直接被EditText爭奪去。如果我們設(shè)置了focusableInTouchMode的話,這樣EditText的父布局就會有這個能力了,這樣只有我們觸摸的時候觸發(fā)相應(yīng)的事件,通過Android中的事件傳遞機制進行傳遞了。

那么問題來了Android中的事件傳遞機制是什么樣的呢?請看下篇博客內(nèi)容!

轉(zhuǎn)載于:https://juejin.im/post/5aa7317e6fb9a028c6755f54

總結(jié)

以上是生活随笔為你收集整理的Android中最详细的焦点问题,从概念出发带你一点点分享(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。