布局面試問題
1.1 Android 中常用的布局都有哪些?
- FrameLayout
- RelativeLayout
- LinearLayout
- AbsoluteLayout
- TableLayout
- GrideLayout(Android 4.0 推出)
- ConstraintLayout
1.2 談?wù)?UI 中, Padding 和 Margin 有什么區(qū)別?
android:padding 和 android:layout_margin 的區(qū)別,其實概念很簡單,padding 是站在父 view 的角度描述問 題,它規(guī)定它里面的內(nèi)容必須與這個父 view 邊界的距離戈抄。margin 則是站在自己的角度描述問題,規(guī)定自己和其他(上下左右)的 view 之間的距離,如果同一級只有一個 view,那么它的效果基本上就和 padding 一樣了滴劲。
1.3 使用權(quán)重如何讓一個控件的寬度為父控件的 1/3?
可以在水平方向的 LinearLayout 中設(shè)置 weightSum 為 3,然后讓其子控件的 weight 為 1,那么該子控件就是 父控件的 1/3跺涤。
1.4 Android 中布局的優(yōu)化措施都有哪些?
這個問題也屬于Android 性能優(yōu)化的一部分盒件。
- 1桌肴、盡可能減少布局的嵌套層級
可以使用 sdk 提供的 hierarchyviewer 工具分析視圖樹,幫助我們發(fā)現(xiàn)沒有用到的布局寸潦。 - 2色鸳、不用設(shè)置不必要的背景,避免過度繪制 比如父控件設(shè)置了背景色,子控件完全將父控件給覆蓋的情況下,那么父控件就沒有必要設(shè)置背景。
- 3甸祭、使用<include>標簽復(fù)用相同的布局代碼
- 4缕碎、使用<merge>標簽減少視圖層次結(jié)構(gòu)
該標簽主要有兩種用法:- 因為所有的 Activity 視圖的根節(jié)點都是 FrameLayout,因此如果我們的自定義的布局也是 FragmenLayout 的時候那么可以使用 merge 替換。
- 當應(yīng)用 Include 或者 ViewStub 標簽從外部導(dǎo)入 xml 結(jié)構(gòu)時,可以將被導(dǎo)入的 xml 用 merge 作為根節(jié) 點表示,這樣當被嵌入父級結(jié)構(gòu)中后可以很好的將它所包含的子集融合到父級結(jié)構(gòu)中,而不會出現(xiàn)冗余的節(jié)點池户。
<merge>只能作為 xml 布局的根元素咏雌。
- 當應(yīng)用 Include 或者 ViewStub 標簽從外部導(dǎo)入 xml 結(jié)構(gòu)時,可以將被導(dǎo)入的 xml 用 merge 作為根節(jié) 點表示,這樣當被嵌入父級結(jié)構(gòu)中后可以很好的將它所包含的子集融合到父級結(jié)構(gòu)中,而不會出現(xiàn)冗余的節(jié)點池户。
- 5、通過<ViewStub>實現(xiàn) View 的延遲加載
1.5 android:layout_gravity 和 android:gravity 的區(qū)別?
android:gravity:設(shè)置的是控件自身上面的內(nèi)容位置 android:layout_gravity:設(shè)置控件本身相對于父控件的顯示位置校焦。
1.6 關(guān)于LinearLayout 的權(quán)重算法赊抖?
<LinearLayout
android:layout_width="210dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="30dp"
android:layout_height="40dp"
android:layout_weight="1"
android:text="button1" />
<Button
android:layout_width="30dp"
android:layout_height="40dp"
android:layout_weight="1"
android:text="button2" />
<Button
android:layout_width="30dp"
android:layout_height="40dp"
android:layout_weight="2"
android:text="button3" />
</LinearLayout>
如上代碼,如何計算出每一個Button的寬度寨典?
布局大小=剩余空間大小權(quán)重所占比例+設(shè)定的寬度
1.7 scrollView 嵌套 listview 方式除了測量還有什么方法?(了解)
- 手動設(shè)置 ListView 高度
經(jīng)過測試發(fā)現(xiàn),在 xml 中直接指定 ListView 的高度,是可以解決這個問題的,但是 ListView 中的數(shù)據(jù)是可變的,實際高度還需要實際測量氛雪。
于是手動代碼設(shè)置 ListView 高度的方法就誕生了。 - 使用單個 ListView 取代 ScrollView 中所有內(nèi)容
如果滿足頭布局和腳布局的 UI 設(shè)計,直接使用 listview 替代 scrollview - 使用 LinearLayout 取代 ListView
既然 ListView 不能適應(yīng) ScrollView,那就換一個可以適應(yīng) ScrollView 的控件,干嘛非要吊死在 ListView 這一棵樹上呢?
而 LinearLayout 是最好的選擇耸成。但如果我仍想繼續(xù)使用已經(jīng)定義好的 Adater 呢?我們只需要自定 義一個類繼承自 LinearLayout,為其加上對 BaseAdapter 的適配报亩。 - 自定義可適應(yīng) ScrollView 的 ListView
這個方法和上面的方法是異曲同工,方法 3 是自定義了 LinearLayout 以取代 ListView 的功能,但如果 我脾氣就是倔,就是要用 ListView 怎么辦?
那就只好自定義一個類繼承自 ListView,通過重寫其 onMeasure 方法,達到對 ScrollView 適配的效果。
1.8 px井氢、dp弦追、dip、dpi花竞、sp 等到底有什么聯(lián)系區(qū)別
- px (pixels)像素 -- 是像素劲件,就是屏幕上實際的像素點單位。
- dip或dp (device independent pixels)設(shè)備獨立像素约急, 與設(shè)備屏幕有關(guān)零远。
- sp (scaled pixels — best for text size)放大像素-- 主要處理字體的大小。
- dpi:屏幕像素密度厌蔽。
1.9 如何將Acitivity中的Window的背景圖設(shè)置為空牵辣?
getWindow().setBackgroundDrawable(null);android的默認背景是不是為空。
2.0 布局適配(理解)
在明白上面基礎(chǔ)問題的一些基本概念后躺枕,這里總結(jié)了一些布局適配的經(jīng)驗服猪。
在Android 中 有4種普遍尺寸:小(small)供填,普通(normal)拐云,大(large)罢猪,超大(xlarge)
常見的普遍分辨率: 低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi) 1080P(xxhdpi)
基本設(shè)置
在中Menifest中添加子元素
android:anyDensity=”true”時,應(yīng)用程序安裝在不同密度的終端上時叉瘩,程序會分別加載xxhdpi膳帕、xhdpi、hdpi薇缅、mdpi危彩、ldpi文件夾中的資源。
相反泳桦,如果設(shè)為false聊品,即使在文件夾下?lián)碛邢嗤Y源掉房,應(yīng)用不會自動地去相應(yīng)文件夾下尋找資源-
適配方案:
使用wrap_content、math_parent、weight wrap_content:
根據(jù)控件的內(nèi)容設(shè)置控件的尺寸 math_parent:根據(jù)父控件的尺寸大小設(shè)置控件的尺寸 weight:權(quán)重界酒,在線性布局中可以使用weight屬性設(shè)置控件所占的比例使用相對布局,禁用絕對布局
創(chuàng)建不同的layout:每一種layout需要保存在相應(yīng)的資源目錄中媚污,目錄以-為后綴命名断医。例如,對大尺寸屏幕(large screens)债蓝,一個唯一的layout文件應(yīng)該保存在res/layout-large/中壳鹤。
使用9-patch PNG圖片:當我們需要使圖片在拉伸后還能保持一定的顯示效果,比如饰迹,不能使圖片中的重要像素拉伸芳誓,不能使內(nèi)容區(qū)域受到拉伸的影響,我們就可以使用.9.png圖來實現(xiàn)
View 初步了解
-
View是什么啊鸭?
簡單來說锹淌,View是Android系統(tǒng)在屏幕上的視覺呈現(xiàn),也就是說你在手機屏幕上看到的東西都是View莉掂。
-
View是如何繪制出來的葛圃?
View的繪制流程是從ViewRoot的performTraversals()方法開始,依次經(jīng)過measure()憎妙,layout()和draw()三個過程才最終將一個View繪制出來库正。
后面的章節(jié)會詳細講View 繪制過程,這里只是基礎(chǔ)略帶一下厘唾。
-
View是怎么呈現(xiàn)在界面上的褥符?
Android中的視圖都是通過Window來呈現(xiàn)的,不管Activity抚垃、Dialog還是Toast它們都有一個Window喷楣,然后通過WindowManager來管理View趟大。Window和頂級View——DecorView的通信是依賴ViewRoot完成的。
-
關(guān)于Android View控件的理解
Android中控件大致被分為兩類ViewGroup,View铣焊。ViewGroup作為容器管理View逊朽。Android視圖,是類似于Dom樹的架構(gòu)曲伊。父視圖負責測量定位繪制等操作叽讳。我們經(jīng)常在用的findViewById 方法代價昂貴的原因,就是因為他負責至上而下遍歷整棵控件樹坟募,來尋找View實例岛蚤,在重復(fù)操作中盡量少用。現(xiàn)在在用的很多控件都是直接或者間接繼承自View的懈糯,為了方便理解可看下圖
這里寫圖片描述 -
View和ViewGroup什么區(qū)別涤妒?
Android的UI界面都是由View和ViewGroup及其派生類組合而成的。其中赚哗,View是所有UI組件的基類她紫,而ViewGroup是容納這些組件的容器,其本身也是從View派生出來的蜂奸。AndroidUI界面的一般結(jié)構(gòu)可參見
這里寫圖片描述需要注意的是嵌套次數(shù)最好不要超過10層犁苏,否則會降低效率,上圖是3層
-
Android View刷新機制扩所?
在Android的布局體系中围详,父View負責刷新、布局顯示子View祖屏;而當子View需要刷新時助赞,則是通知父View來完成
-
RelativeLayout和LinearLayout性能比較?
1.RelativeLayout會讓子View調(diào)用2次onMeasure袁勺,LinearLayout 在有weight時雹食,也會調(diào)用子View2次onMeasure
2.RelativeLayout的子View如果高度和RelativeLayout不同,則會引發(fā)效率問題期丰,當子View很復(fù)雜時群叶,這個問題會更加嚴重。如果可以钝荡,盡量使用padding代替margin街立。
3.在不影響層級深度的情況下,使用LinearLayout和FrameLayout而不是RelativeLayout。
-
Android UI界面架構(gòu)理解
每個Activity埠通,Dialog赎离,Toast都包含一個PhoneWindow對象,PhoneWindow設(shè)置DecorView為應(yīng)用窗口的根視圖端辱。在里面就是熟悉的TitleView和ContentView,沒錯梁剔,平時使用的setContentView()就是設(shè)置的ContentView虽画。
這里寫圖片描述