2012-06-25 125 views
0

我有一個要求,我必須在我的應用程序中提供不同的layout資源。如何提供替代佈局資源

此應用程序應該運行在許多屏幕尺寸(一如既往),我希望能夠儘可能精確地解決其中的許多屏幕尺寸。

截至目前,我針對以下屏幕尺寸:

  • 1280×800
  • 800×480
  • 800×600
  • 1024x600的

對於這一點,我創建了一個佈局結構是這樣:

Layout structure

而在XML中,我已經宣佈了以下支持:

<supports-screens android:resizeable="true" 
       android:smallScreens="true" 
       android:normalScreens="true" 
       android:largeScreens="true" 
       android:xlargeScreens="true" 
       android:anyDensity="true"/> 

我正在測試在其仿真器和問題是:它接受layout-w480dp-land XML,但是當我在縱向模式走,它回落默認佈局。

任何想法,我可能會出錯?

回答

3

正如我在Android聊天室說,PixelsDensity-independent pixel (dp)是不同的:

密度獨立像素(DP)

虛擬像素單元,您應該在定義UI佈局時使用 以表示佈局尺寸或以密度無關的方式位置 。與密度無關的像素爲等效於160dpi屏幕上的一個物理像素的 ,這是系統爲「中等」密度屏幕假設的基準密度。 在運行時,系統根據所用屏幕的實際密度,根據需要透明地處理dp 單位的任何縮放比例。 將dp單位轉換爲屏幕像素很簡單:px = dp *(dpi /160)。例如,在240 dpi屏幕上,1 dp等於1.5像素的物理 像素。定義 應用程序的用戶界面時,應始終使用dp單位,以確保在不同密度的屏幕上正確顯示您的用戶界面。

當你有一個文件夾命名佈局w480dp你的意思是:

「只要寬度尺寸等於或大於480 DP使用此佈局文件夾。 「現在

,如果你有一個240dpi設備與屏幕尺寸480x800像素(這是很可能的),那麼你實際上只擁有320dp一起玩 - 爲什麼你的文件夾現在已經被跳過解釋。

DP = PX /(DPI/160)

320dp = 480像素/(240dpi/160)

+0

非常有道理。現在我得到你想說的話。所以在你的情況下,我怎麼知道哪一個目標,320dp或480dp? –

0

我聽到下面的佈局資源:

res/layout-sw600dp 
res/layout-sw720dp 

不知道你的問題,但我還沒有聽說過w480dp,它可能是sw480dp

+1

'的情況下「smalles」寬度可sw480dp'工作是480dp,'w480dp'在當前寬度大約爲480dp或更多時起作用。並且在縱向模式下默認模擬器在'480x800' –

0

使用

ldpi Resources for low-density (ldpi) screens (~120dpi). 
mdpi Resources for medium-density (mdpi) screens (~160dpi). (This is the baseline density.) 
hdpi Resources for high-density (hdpi) screens (~240dpi). 
xhdpi Resources for extra high-density (xhdpi) screens (~320dpi). 

代替w480dp

,並按照下表。 Android docs

+0

我不認爲這是我在這裏問的。 如果你在談論'drawable'資源,我不關心它們。根據屏幕尺寸,我擔心「佈局」 –

+0

這也適用於佈局資源。請閱讀提供的鏈接 –

+1

讓我試試,我會回來 –

0

嗯,我從來沒有這樣做過,但我做的是在運行時測量屏幕大小和密度,並在開始時在onCreate()中應用佈局。 下面是代碼,供您參考,並可能幫助你:

/** 
    * To acknowledge the density of the application so as to use the layout 
    * according to the phone density 
    */ 
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    switch(metrics.densityDpi){ 
     case DisplayMetrics.DENSITY_LOW: 
      setContentView(R.layout.x); 
        break; 
     case DisplayMetrics.DENSITY_MEDIUM: 
      setContentView(R.layout.y); 
        break; 
     case DisplayMetrics.DENSITY_HIGH: 
      setContentView(R.layout.z); 
        break; 
+0

這是一個不錯的選擇,但由於某些原因,我想通過XML做到這一點,我會保持這個作爲備份選項:D –

+0

對於佈局方式,請嘗試使用:而不是,並根據需要嘗試res/layout /或res/layout-根據你的需要,小尺寸/或res/layout-large /或res/layout-xlarge /大小需要720p大小的屏幕。我很確定替換會生效並且風景嘗試加後綴<-land>。乾杯 – iabhi

+0

我試過'大土地「的方式,它只是沒有工作,回落到默認的一個,而且,他們在3.x –

1

我可以把你從雷託的谷歌I/O 2011屆的一個梅耶爾:

的一種方式,以支持最新的設備,同時還支持較老版本的 是使用決定 設備是什麼平臺飛奔一個「墊片」活動G。它沒有UI。 Reto顯示了一些代碼,用於根據系統版本啓動不同的活動 。這是一個 並行活動模式...

Link to session - 他的介紹也可下載,在並行模式原理從幻燈片開始10