2012-06-06 59 views
3

我的問題與在Android平臺上針對不同屏幕密度使用不同的佈局有關。FindViewById和針對不同屏幕密度的多種佈局(Android)

假設我有四個main.xml文件(每個文件夾在它們各自的文件夾中,它們對應的屏幕密度:ldpi,mdpi,hdpi和xhdpi),假設它們全部完全相同。但是,讓我們說我想擺脫ldpi佈局的一些UI元素。當我試圖在ldpi手機的ldpi佈局中查找該視圖時,如何處理Java端的事情以避免空指針異常?我應該檢查並查看findviewbyid是否返回null並從那裏繼續?

我意識到你應該保持事物在你的應用程序中統一,但有時它似乎只是擺脫一個方便但不必要的UI元素更有意義。我喜歡在這些新手機上擁有更多的房地產,但是如果/當需要製作ldpi佈局時,我寧願不要將所有內容都塞進那裏,當它看起來更好時,就是爲了擺脫一些東西,如果那有意義的話!

+1

還有另外一個問題,有人可能會問自己。還有多少個ldpi設備?例如。當我下載官方ICS圖標包時,沒有ldpi版本。說實話,我試圖讓我的應用程序在ldpi設備上工作,但不要優化佈局以適應它們。在我的情況下,這是不值得的時間 –

+0

這是真的 - 我並不真正出汗ldpi支持太多。哎呀,即使是我買的這款笨拙的Droid Eris測試手機也使用mdpi!也就是說,我仍然對處理這個問題的所有不同方式感興趣。 – Brett

+0

這不完全是你要找的,你可能知道它,但有人看到這個線程可能會感興趣。你總是可以製作一個帶有後備佈局的'layout-nodpi'文件夾 –

回答

2

這是個好問題。空檢查可以是解決方案之一。 另一個解決方案是檢查屏幕屬性。看看這個例子:

public static boolean isTabletPC(Context context) { 
     boolean isHoneycomb = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; 
     boolean hasLargeScreen = (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) 
       >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
     return isHoneycomb & hasLargeScreen; 
    } 
0

這與處理任何可選元素的處理方式相同。檢查它是否存在(不爲空)並進行相應處理。如果View不存在,則findViewById將返回空值,並且您可以在if(null != view){}塊內的View上進一步操作,或者如果有多個可分組的可選元素,則可以使用實例變量。

HoneycombGallery演示給出瞭如何檢測使用的佈局(雖然在演示中,它是爲片段完成,它可以應用於任何View)

0

從AP拉特11,你可能會希望設備性能的想法爲此使用fragments。通過這種方式,您的java代碼總是處理明確存在的視圖,並且您的佈局可以顯示(或不顯示)關注自己業務的某些片段。

我會反對亂拋垃圾的代碼,檢查你有什麼樣的屏幕,並檢查某個視圖是否在屏幕上。

如果你看看圖一個鏈接頁面上,你看到的我是什麼意思一個明顯的例子:

fragments on different devices

+0

你在多個設備上用不同的分辨率做什麼? – breceivemail

+0

我不知道你的意思。你可以爲不同的設備製作佈局,這樣你就可以擴展和適應等等,只要你有一些接口的一部分_not there_(就像上面的例子),你就可以分割它。因此,所有獲得片段A的設備都會看到相同的內容(但可能基於不同的圖片(分辨率)等),以及沒有得到不適合用戶界面的部分的屏幕..他們不知道它(再次,在上例中,平板電腦獲得了片段B,但手機沒有//必須轉到另一個活動) – Nanne

+0

我的意思是,有時候程序員需要根據設備分辨率爲其用戶界面指定一些功能。例如創建自定義鍵盤需要不同分辨率的不同功能。他如何確定解決方案中代碼中的設備分辨率? – breceivemail