Android中最详细的焦点问题,从概念出发带你一点点分享(1)
文章最早發布于我的微信公眾號 Android_De_Home 中,歡迎大家掃描下面二維碼關注微信公眾獲取更多知識內容。
本文為sydMobile原創文章,可以隨意轉載,但請務必注明出處!
今天寫的這篇博客主要是針對在Android中的焦點問題,網上有很多關于焦點博客文章,但是大多數都是不全的,要么就是直接分析源碼,要么就是直接講遇到什么問題怎么解決,總之不夠全面。往往導致我們看完一篇博客后只是會了怎么解決那個問題,對什么是焦點還是說不出來,遇到問題還是解決不了。這也是我寫這篇博客的主要原因。這篇博客從最簡單的概念說起,然后一點點分享源碼,讓你可以對焦點不再模棱兩可。
焦點概念
焦點在Android中也就是Focus,稱為Focus機制。以后我們看到Focus就是指的焦點!那么什么是焦點機制呢?或者什么是焦點呢?
概念:所謂焦點就和我們生活中一樣,比如你的同學聚會中,誰是焦點啊。其實意思差不多,焦點就是最受關注的哪一個,人們都圍繞著它。再來回到我們Android開發中,比如一個頁面有3個EditText,那么當你鍵盤輸入內容的時候,這個時候會在哪一個EditText里面顯示內容呢?這個時候就是誰獲得了焦點就在那個EditText中顯示內容。(注意:有很多人把焦點和點擊混了,以為我點擊了某個控件,這個控件就獲取焦點了,這個是不一定的,不能這么認為!后面會有說明)
說白了就是你手機當前屏幕上的焦點在那個控件上,體現就是當前控件獲取了焦點,對于EditText來說,體現就是鍵盤輸入的內容,會輸入到這個EditText上面。如果這個EditText沒有獲取焦點的話,鍵盤輸入的內容是不會在EditText內顯示的。
獲取焦點的兩種模式
觸摸模式(TouchMode)與普通模式
用代碼的體現就是:如果請求有觸摸獲取焦點的能力,在xml中的配置是 android:focusableInTouchMode="true"
請求有普通獲取焦點的能力(可以理解為通過物理鍵盤),在xml中的配置是android:focusable="true"
具體的來說說這兩種模式:
- focusable
出現這種模式主要是因為Android系統不僅僅是針對手機的,有可能在電視、手表等等的非觸摸輸入設備上。在手機上其實普通模式很少用了,現在的手機基本都是觸摸屏并且沒有物理上下鍵的,這種模式是用在TV等一些有物理鍵的產品上面的。比如非觸摸屏手機或者TV,如果設置為true,則鍵盤上下左右選中,焦點會隨之移動。比如有物理上下鍵,你按一個向下鍵,屏幕上的內容就會對應選中一個向下的控件,如果這個控件有focusable能力的話這個時候這個控件就是獲得了焦點。
- focusableInTouchMode
在Android開發中對于現在的手機來說,都是觸摸模式(TocuMode),就是當你觸摸一個控件的時候,這個控件會獲取焦點。注意:有些控件是默認不具有觸摸獲取焦點的功能的(Button、TextView、LinearLayout等等這些控件是默認沒有觸摸獲取焦點功能的,為什么會有這種問題呢?原因是這些控件有時候可能會想要先響應點擊事件,如果觸摸獲取焦點功能打開后,當你點一下,默認是不會調用點擊事件的,這個時候會先讓這個控件獲取焦點)EditText是默認有觸摸獲取焦點功能的,并將第一搶先獲取焦點。這就解釋了為什么當一個頁面有EditText的時候,我們進入的時候默認有光標,鍵盤彈出,這就是焦點在這EditText上面。
就像上面說的那些控件(Button、TextView等等這些默認沒有觸摸獲取焦點功能的控件),當你點擊它的時候,它也不會獲取焦點也就是調用 isFocused()方法的時候返回的也是false,這個時候默認的是觸發到它的點擊事件。如果你配置了focusableInTouchMode的話這個時候這些控件才會獲取焦點,而這個時候是不會觸發點擊事件的,觸發的是 OnFocusChangeListener。這個時候獲取了焦點,當你在點擊的時候才會觸發點擊事件。
總結:這兩個屬性都是表示是否可以獲取焦點,focusableInTouchMode是針對觸屏的。 android:focusable是針對有物理鍵下操作的。我們在Android開發中主要是用focusableInTouchMode。
分析一下為什么出現EditText自動獲取焦點的問題
我們都知道如果在布局中有EdiText的話,EditText會默認獲得焦點,彈出鍵盤。解決方法網上也很多了,就是在EditText的父布局中添加 focusableInTouchMode = true 。網上大多數會添加focusable = true。我們通過上面的內容可以知道,對于手機來說,只需要添加 focusableInTouchMode = true 就可以了。
EditText自動獲取焦點主要是因為當我們沒有給EditText的父布局設置focusableInTouchMode的時候,它的父布局是默認沒有這個能力的,所以焦點就會直接被EditText爭奪去。如果我們設置了focusableInTouchMode的話,這樣EditText的父布局就會有這個能力了,這樣只有我們觸摸的時候觸發相應的事件,通過Android中的事件傳遞機制進行傳遞了。
那么問題來了Android中的事件傳遞機制是什么樣的呢?請看下篇博客內容!
轉載于:https://juejin.im/post/5aa7317e6fb9a028c6755f54
總結
以上是生活随笔為你收集整理的Android中最详细的焦点问题,从概念出发带你一点点分享(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【雕爷学编程】Arduino动手做(2)
- 下一篇: EverestLinux是什么