Android 面試題總結之Android 基礎(六)

Android 面試題總結之Android 基礎(六)

在上一章節Android 面試題總結之Android 基礎ListView(五) 主要是ListView的優化,原理以及一些基本問題。java

在閱讀過程當中有任何問題,請及時聯繫。如需轉載請註明 fuchenxuan de Blog
本章系《Android 之美 從0到1 – 高手之路》Android基礎將會總結了Android 佈局常見面試問題。其實對於基礎方面Android 開發來講,常常面試無非就是UI,網絡,數據庫,這三大方面,本章節總結了筆記經典的問題,但願對廣大Android 開發者,有所幫助。 android

佈局面試問題

  1. Android 中經常使用的佈局都有哪些?
    • FrameLayout
    • RelativeLayout
    • LinearLayout
    • AbsoluteLayout
    • TableLayout
    • GrideLayout(Android 4.0 推出)
  2. 談談 UI 中, Padding 和 Margin 有什麼區別?面試

    android:paddingandroid:layout_margin 的區別,其實概念很簡單,padding 是站在父 view 的角度描述問 題,它規定它裏面的內容必須與這個父 view 邊界的距離。margin 則是站在本身的角度描述問題,規定本身和其餘(上下左右)的 view 之間的距離,若是同一級只有一個 view,那麼它的效果基本上就和 padding 同樣了。算法

  3. 使用權重如何讓一個控件的寬度爲父控件的 1/3?
    能夠在水平方向的 LinearLayout 中設置 weightSum 爲 3,而後讓其子控件的 weight 爲 1,那麼該子控件就是 父控件的 1/3。
  4. Android 中佈局的優化措施都有哪些?
    這個問題也屬於Android 性能優化的一部分。
    一、儘量減小布局的嵌套層級
    可使用 sdk 提供的 hierarchyviewer 工具分析視圖樹,幫助咱們發現沒有用到的佈局。
    二、不用設置沒必要要的背景,避免過分繪製 好比父控件設置了背景色,子控件徹底將父控件給覆蓋的狀況下,那麼父控件就沒有必要設置背景。
    三、使用<include>標籤複用相同的佈局代碼
    四、使用<merge>標籤減小視圖層次結構
    該標籤主要有兩種用法:
    1) 由於全部的 Activity 視圖的根節點都是 FrameLayout,所以若是咱們的自定義的佈局也是 FragmenLayout 的時候那麼可使用 merge 替換。
    2) 當應用 Include 或者 ViewStub 標籤從外部導入 xml 結構時,能夠將被導入的 xml 用 merge 做爲根節 點表示,這樣當被嵌入父級結構中後能夠很好的將它所包含的子集融合到父級結構中,而不會出現冗餘的節點。
    <merge>只能做爲 xml 佈局的根元素。
    五、經過<ViewStub>實現 View 的延遲加載
  5. android:layout_gravity 和 android:gravity 的區別?
    第一個是讓該佈局在其父控件中的佈局方式,第二個是該佈局佈置其字對象的佈局方式。數據庫

  6. 關於LinearLayout 的權重算法? 性能優化

    <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的寬度?markdown

    佈局大小=剩餘空間大小權重所佔比例+設定的寬度網絡

    這裏寫圖片描述

  7. scrollView 嵌套 listview 方式除了測量還有什麼方法?架構

    1. 手動設置 ListView 高度
      通過測試發現,在 xml 中直接指定 ListView 的高度,是能夠解決這個問題的,可是 ListView 中的數據是可變的,實際高度還須要實際測量。
      因而手動代碼設置 ListView 高度的方法就誕生了。
    2. 使用單個 ListView 取代 ScrollView 中全部內容
      若是知足頭佈局和腳佈局的 UI 設計,直接使用 listview 替代 scrollview
    3. 使用 LinearLayout 取代 ListView
      既然 ListView 不能適應 ScrollView,那就換一個能夠適應 ScrollView 的控件,幹嗎非要吊死在 ListView 這一棵樹上呢?
      而 LinearLayout 是最好的選擇。但若是我仍想繼續使用已經定義好的 Adater 呢?咱們只須要自定 義一個類繼承自 LinearLayout,爲其加上對 BaseAdapter 的適配。
    4. 自定義可適應 ScrollView 的 ListView
      這個方法和上面的方法是殊途同歸,方法 3 是自定義了 LinearLayout 以取代 ListView 的功能,但若是 我脾氣就是倔,就是要用 ListView 怎麼辦?
      那就只好自定義一個類繼承自 ListView,經過重寫其 onMeasure 方法,達到對 ScrollView 適配的效果。
  8. dp 和 px 之間的關係?
    dp:是 dip 的簡寫,指密度無關的像素。 指一個抽象意義上的像素,程序用它來定義界面元素。一個與密度無關的,在邏輯尺寸上,與一個位於像素密度爲 160dpi 的屏幕上的像素是一致的。 要把密度無關像素轉換爲屏幕像素,能夠用這樣一個簡單的公式: pixels=dips*(density/160)。舉個例子,在 DPI 爲 240 的屏幕上,1 個 DIP 等 於 1.5 個物理像素。
    佈局時最好使用 dp 來定義咱們程序的界面,由於這樣能夠保證咱們的 UI 在各類分辨率的屏幕上均可以正常顯示。app

    /** * 根據手機的分辨率從 px(像素) 的單位 轉成爲 dp */
    public static int px2dip(Context context, float pxValue) {
    final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f);
    }
    /** * 根據手機的分辨率從 dip 的單位 轉成爲 px(像素) */
    public static int dip2px(Context context, float dpValue) {
    final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f);
    }

    因而乎,應該也能理解android項目中的圖片資源文件,通常咱們須要在如下幾個文件夾中提供不一樣大小的圖片。

    • xhdpi: 2.0
    • hdpi: 1.5
    • mdpi: 1.0 (baseline)
    • ldpi: 0.75
      若是一張放在mdpi 的圖片加載到內存中大小是 10m ,那麼遇到hdpi的設備圖片加載到內存中大小是15m。
  9. 什麼是屏幕尺寸、屏幕分辨率、屏幕像素密度?
    屏幕尺寸是指屏幕對角線的長度。單位是英寸,1英寸=2.54釐米
    屏幕分辨率是指在橫縱向上的像素點數,單位是px,1px=1像素點,通常是縱向像素橫向像素,如1280×720
    屏幕像素密度是指每英寸上的像素點數,單位是dpi,即「dot per inch」的縮寫,像素密度和屏幕尺寸和屏幕分辨率有關。

  10. Android 樣式和主題?
    樣式(Styles):
    Android 容許在外部樣式文件中定義 Android 應用程序的 Look 和 Feel ,你能夠將定義好的樣式應用在不一樣的視圖(Views)上。你能夠在 XML 文件中定義樣式,並將這些樣式運用到不一樣的組件上。使用XML這種方式定義樣式,你只須要配置一些通用的屬性,之後若是須要修改樣式,能夠集中修改。
    屬性(Attributes):
    你也能夠將單個屬性應用到 Android 樣式上,一般會在自定義View 的時候,自定義屬性。
    主題(Themes):
    主題相比單個視圖而言,是應用到整個 Activity 或者 application 的樣式

  11. 如何將Acitivity中的Window的背景圖設置爲空?
    getWindow().setBackgroundDrawable(null);android的默認背景是否是爲空。

佈局適配

在明白上面基礎問題的一些基本概念後,這裏總結了一些佈局適配的經驗。
在Android 中 有4種廣泛尺寸:小(small),普通(normal),大(large),超大(xlarge)
常見的廣泛分辨率: 低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi) 1080P(xxhdpi)

  • 基本設置
    在中Menifest中添加子元素
    android:anyDensity=」true」時,應用程序安裝在不一樣密度的終端上時,程序會分別加載xxhdpi、xhdpi、hdpi、mdpi、ldpi文件夾中的資源。
    相反,若是設爲false,即便在文件夾下擁有相同資源,應用不會自動地去相應文件夾下尋找資源

  • 適配方案:

    1. 使用wrap_content、math_parent、weight wrap_content:
      根據控件的內容設置控件的尺寸 math_parent:根據父控件的尺寸大小設置控件的尺寸 weight:權重,在線性佈局中可使用weight屬性設置控件所佔的比例
    2. 使用相對佈局,禁用絕對佈局

    3. 建立不一樣的layout:每一種layout須要保存在相應的資源目錄中,目錄以-爲後綴命名。例如,對大尺寸屏幕(large screens),一個惟一的layout文件應該保存在res/layout-large/中。

    4. 使用9-patch PNG圖片:當咱們須要使圖片在拉伸後還能保持必定的顯示效果,好比,不能使圖片中的重要像素拉伸,不能使內容區域受到拉伸的影響,咱們就可使用.9.png圖來實現

Android Drawable

Drawable屬於輕量級的、使用也很簡單,Android把可繪製的對象抽象爲Drawable,不一樣的圖形圖像資源就表明着不一樣的drawable類型, 在實際的開發過程當中使用@drawable來使用drawable資源。關於Drawable更多的請看下圖

這裏寫圖片描述

Android 5.0 新特性–使用SVG圖片資源
SVG的全稱是Scalable Vector Graphics,叫可縮放矢量圖形。它和位圖(Bitmap)相對,SVG不會像位圖同樣由於縮放而讓圖片質量降低。
優勢:
* 圖片的完美適配。SVG 圖像在放大或改變尺寸的狀況下其圖形質量不會有所損失。這樣咱們大大減小了適配所須要的多種分辨率圖片,並且可以讓圖片完美適配多種分辨率,減小了APK包大小並提高了用戶體驗。
* 尺寸的減少。SVG 是使用XML文件描述的,這種文本格式的圖片尺寸很小,並且便於修改。
* 設計上的輕便。在設計方面咱們能夠任意修改SVG圖片的顏色,這對於某些狀況下須要同一張圖像但不一樣的顏色圖片是很是方便的,只須要修改fill顏色就能夠了。好比,單擊下圖片的不一樣狀態、按鈕的背景圖片等等。
這裏寫圖片描述

View 初步瞭解

  1. View是什麼?
    簡單來講,View是Android系統在屏幕上的視覺呈現,也就是說你在手機屏幕上看到的東西都是View。

  2. View是如何繪製出來的?
    View的繪製流程是從ViewRoot的performTraversals()方法開始,依次通過measure(),layout()和draw()三個過程才最終將一個View繪製出來。
    後面的章節會詳細講View 繪製過程,這裏只是基礎略帶一下。

  3. View是怎麼呈如今界面上的?
    Android中的視圖都是經過Window來呈現的,無論Activity、Dialog仍是Toast它們都有一個Window,而後經過WindowManager來管理View。Window和頂級View——DecorView的通訊是依賴ViewRoot完成的。

  4. 關於Android View控件的理解
    Android中控件大體被分爲兩類ViewGroup,View。ViewGroup做爲容器管理View。Android視圖,是相似於Dom樹的架構。父視圖負責測量定位繪製等操做。咱們常常在用的findViewById 方法代價昂貴的緣由,就是由於他負責至上而下遍歷整棵控件樹,來尋找View實例,在重複操做中儘可能少用。如今在用的不少控件都是直接或者間接繼承自View的,爲了方便理解可看下圖

    這裏寫圖片描述

  5. View和ViewGroup什麼區別?
    Android的UI界面都是由View和ViewGroup及其派生類組合而成的。其中,View是全部UI組件的基類,而ViewGroup是容納這些組件的容器,其自己也是從View派生出來的。AndroidUI界面的通常結構可參見

    這裏寫圖片描述

    須要注意的是嵌套次數最好不要超過10層,不然會下降效率,上圖是3層

  6. Android View刷新機制?
    在Android的佈局體系中,父View負責刷新、佈局顯示子View;而當子View須要刷新時,則是通知父View來完成

  7. RelativeLayout和LinearLayout性能比較?
    1.RelativeLayout會讓子View調用2次onMeasure,LinearLayout 在有weight時,也會調用子View2次onMeasure
    2.RelativeLayout的子View若是高度和RelativeLayout不一樣,則會引起效率問題,當子View很複雜時,這個問題會更加嚴重。若是能夠,儘可能使用padding代替margin。
    3.在不影響層級深度的狀況下,使用LinearLayout和FrameLayout而不是RelativeLayout。

  8. Android UI界面架構理解
    每一個Activity,Dialog,Toast都包含一個PhoneWindow對象,PhoneWindow設置DecorView爲應用窗口的根視圖。在裏面就是熟悉的TitleView和ContentView,沒錯,平時使用的setContentView()就是設置的ContentView。
    這裏寫圖片描述

    關於View的內容仍是比較多的,而本文只是做爲Android基礎的知識點做爲初步瞭解,後面會有專門的章節來說解關於View的更多知識點。

    水平有限,如有錯漏,歡迎指正,批評,如需轉載,請註明出處–http://blog.csdn.net/vfush,謝謝!

相關文章
相關標籤/搜索