Android 面試題之基礎(chǔ)(不斷更新)

布局面試問題

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)
    該標簽主要有兩種用法:
      1. 因為所有的 Activity 視圖的根節(jié)點都是 FrameLayout,因此如果我們的自定義的布局也是 FragmenLayout 的時候那么可以使用 merge 替換。
      1. 當應(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 布局的根元素咏雌。
  • 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è)定的寬度

image.png

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 初步了解

  1. View是什么啊鸭?

    簡單來說锹淌,View是Android系統(tǒng)在屏幕上的視覺呈現(xiàn),也就是說你在手機屏幕上看到的東西都是View莉掂。

  2. View是如何繪制出來的葛圃?

    View的繪制流程是從ViewRoot的performTraversals()方法開始,依次經(jīng)過measure()憎妙,layout()和draw()三個過程才最終將一個View繪制出來库正。

    后面的章節(jié)會詳細講View 繪制過程,這里只是基礎(chǔ)略帶一下厘唾。

  3. View是怎么呈現(xiàn)在界面上的褥符?

    Android中的視圖都是通過Window來呈現(xiàn)的,不管Activity抚垃、Dialog還是Toast它們都有一個Window喷楣,然后通過WindowManager來管理View趟大。Window和頂級View——DecorView的通信是依賴ViewRoot完成的。

  4. 關(guān)于Android View控件的理解

    Android中控件大致被分為兩類ViewGroup,View铣焊。ViewGroup作為容器管理View逊朽。Android視圖,是類似于Dom樹的架構(gòu)曲伊。父視圖負責測量定位繪制等操作叽讳。我們經(jīng)常在用的findViewById 方法代價昂貴的原因,就是因為他負責至上而下遍歷整棵控件樹坟募,來尋找View實例岛蚤,在重復(fù)操作中盡量少用。現(xiàn)在在用的很多控件都是直接或者間接繼承自View的懈糯,為了方便理解可看下圖

    這里寫圖片描述
  5. View和ViewGroup什么區(qū)別涤妒?

    Android的UI界面都是由View和ViewGroup及其派生類組合而成的。其中赚哗,View是所有UI組件的基類她紫,而ViewGroup是容納這些組件的容器,其本身也是從View派生出來的蜂奸。AndroidUI界面的一般結(jié)構(gòu)可參見

    這里寫圖片描述

    需要注意的是嵌套次數(shù)最好不要超過10層犁苏,否則會降低效率,上圖是3層

  6. Android View刷新機制扩所?

    在Android的布局體系中围详,父View負責刷新、布局顯示子View祖屏;而當子View需要刷新時助赞,則是通知父View來完成

  7. 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。

  8. Android UI界面架構(gòu)理解

    每個Activity埠通,Dialog赎离,Toast都包含一個PhoneWindow對象,PhoneWindow設(shè)置DecorView為應(yīng)用窗口的根視圖端辱。在里面就是熟悉的TitleView和ContentView,沒錯梁剔,平時使用的setContentView()就是設(shè)置的ContentView虽画。

    這里寫圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荣病,隨后出現(xiàn)的幾起案子码撰,更是在濱河造成了極大的恐慌,老刑警劉巖众雷,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灸拍,死亡現(xiàn)場離奇詭異做祝,居然都是意外死亡砾省,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門混槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來编兄,“玉大人,你說我怎么就攤上這事声登『菰В” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵悯嗓,是天一觀的道長件舵。 經(jīng)常有香客問我,道長脯厨,這世上最難降的妖魔是什么铅祸? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮合武,結(jié)果婚禮上临梗,老公的妹妹穿的比我還像新娘。我一直安慰自己稼跳,他們只是感情好盟庞,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汤善,像睡著了一般什猖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上红淡,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天不狮,我揣著相機與錄音,去河邊找鬼锉屈。 笑死荤傲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的颈渊。 我是一名探鬼主播遂黍,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼终佛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雾家?” 一聲冷哼從身側(cè)響起铃彰,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芯咧,沒想到半個月后牙捉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡敬飒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年邪铲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无拗。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡带到,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出英染,到底是詐尸還是另有隱情揽惹,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布四康,位于F島的核電站搪搏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闪金。R本人自食惡果不足惜疯溺,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毕泌。 院中可真熱鬧喝检,春花似錦、人聲如沸撼泛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愿题。三九已至损俭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潘酗,已是汗流浹背杆兵。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仔夺,地道東北人琐脏。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親日裙。 傳聞我的和親對象是個殘疾皇子吹艇,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容