2012-01-20 78 views
2

我正在構建一個Android應用程序,該應用程序使用不同的佈局文件夾(即大,xlarge等)基於屏幕大小調整大小。我可以以編程方式選擇Android佈局文件夾嗎?

唯一的問題是,我想爲用戶提供一種在小屏幕和大屏幕布局之間切換的方法,以防他們的預蜂窩平板電腦無法識別xlarge標籤,或者設備距離較近手機的大小,但仍然足夠大,用戶想要使用平板電腦佈局。

有沒有一種方法可以創建按鈕來切換佈局文件夾?我仍然想使用基於屏幕大小的自動文件夾選擇,我也想強制應用程序使用一個文件夾或其他。

這可能嗎?

回答

6

安卓團隊鼓勵您使用資源限定符來支持任何種類的多設備支持。例如

佈局小的小屏幕 佈局LDPI與低密度 佈局恩的語言環境設備的設備...

this它會幫助你很多

但一般不,沒有編程的方式來做到這一點,也許有一些解決方法,但我不鼓勵這樣做。

而且也許你需要看到片段設計,以瞭解GUI像平板電腦和手機不同設備的發展......

1

是的,可以。這很簡單!我這樣做是因爲傳統(預API級別13)系統不支持較新的佈局文件夾過濾器。具體來說,我需要區分QVGA(小)和WQVGA(正常)以及其他常規分辨率。

只需將各種佈局文件添加到佈局和佈局文件夾文件夾中即可。

layout 
    my_layout_default.xml 
    my_layout_qvga.xml 
layout-land 
    my_layout_default.xml 
    my_layout_qvga.xml 

然後,在運行時選擇適當的佈局:

protected void onCreate(Bundle savedInstanceState) 
{ 
    // Some code that uses DisplayMetrics to determine the screen type 
    ScreenType st = Util.getScreenType(this); 
    super.onCreate(savedInstanceState); 
    setContentView(st == ScreenType.ST_QVGA ? R.layout.my_layout_qvga : R.layout.my_layout_default); 
    // ... 

您可以將標記添加到每個佈局以發現哪一個是實際加載,如果你喜歡,例如

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/my_root_view" 
    android:tag="st_port_QVGA" 

FrameLayout flRoot = (FrameLayout)findViewById(R.id.my_root_view); 
Object objTag = flRoot.getTag(); 
if (objTag instanceof String) 
{ 
    String strTag = (String)objTag; 
    System.out.println("Tag = " + strTag); 
} 

順便說一句,沒有理由不能將此技術與通常的資源限定符結合使用,例如,像my_layout_default.xml文件添加到其他文件夾。

+0

但是選擇了R.layout.my_layout_qvga嗎? '佈局'中的那個?或'layout-land'? –

0

我遇到了非常相似的情況。我的細節片段通常全屏顯示,但在平板電腦上,它有時可能只佔屏幕寬度的70%(在主細節流程中)。當細節片段在平板電腦上全屏時,它應該使用較大的佈局。當細節片段只有寬度的70%時,它應該使用較小的電話佈局。這是我如何處理它。

我有像這樣

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <include layout="@layout/fragment_detail_force_phone" /> 

</LinearLayout> 

fragment_detail_force_phone.xml包含實際佈局要小屏幕(或當它是被顯示在一個片劑僅70%寬度)fragment_detail.xml。這避免了代碼重複。

大布局在sw600dp/fragment_detail.xml。當我膨脹細節片段時,我檢查getActivity()以查看這個片段是否正在狹窄的空間中加載,這意味着我想強制手機佈局。如果是這樣,我膨脹R.layout.fragment_detail_force_phone。由於該佈局沒有平板電腦版本,因此如果我指定了這個版本,它總是會加載電話代碼。否則,我會膨脹R.layout.fragment_detail,Android會照常照常進行選擇。

相關問題