2012-05-21 22 views
7

如何以編程方式確定我的應用正在使用哪種佈局(佈局正常,佈局大等)?我看到getWindowManager()。getDefaultDisplay()。getMetrics(度量)調用,但它似乎只處理屏幕密度,但不需要應用程序使用哪種佈局。我需要的信息,因爲我需要在運行時動態地改變一些視圖的位置。如何以編程方式確定我的Android應用程序正在使用哪種XML佈局?

在此先感謝。

回答

0

爲什麼你不能把什麼位置的意見應該在xml中?這種方式時,特定的佈局類型被稱爲你不需要以編程方式做任何事情?

你可以使用不同的文件夾類型,如layoutlayout-sw600dplayout-sw720dp

看到http://developer.android.com/guide/topics/resources/providing-resources.html進行不同的配置

+0

我確實使用了不同的佈局文件夾(不能使用swxxxdp,因爲我需要保持與2.x兼容),這就是爲什麼我需要知道應用程序使用哪個佈局文件夾。基於用戶操作,我有一些視圖元素需要在運行時動態顯示。 – Kenny

+0

以及如果你使用不同的文件夾,那麼你應該沒有問題,因爲操作系統根據設備選擇使用哪種佈局。例如,如果用戶擁有一臺被認爲是「大」或VGA的設備,那麼它將使用'layout-large'文件夾中的佈局。你只需要確保每個文件夾中的文件都是相同的。我知道你不需要做所有這些額外的東西,你認爲你做了 – tyczj

+0

瞭解。但是我的觀點並不是XML的一部分,需要根據所選的屏幕大小/佈局在運行時略有不同,這就是爲什麼我需要知道哪一個被使用,以便我可以調整和添加視圖因此。我已經將「基準」XML命名爲相同,但在每個layout-xyz文件夾中實現方式略有不同。 – Kenny

0
ViewGroup view = (ViewGroup)getWindow().getDecorView(); 
LinearLayout content = (LinearLayout)view.getChildAt(0); 
int id = content.getId(); 

的ID告訴你哪個佈局你使用(假設你設定的XML中的id標籤)。

+0

嗯。我試着用我的RelativeLayout視圖:'RelativeLayout content =(RelativeLayout)view.getChildAt(0);'它會導致一個類型轉換異常:'java.lang.ClassCastException:android.widget.FrameLayout'。任何想法爲什麼? – Kenny

2

我正在尋找相同的東西!我發現2類似questons /回答:

Getting ScreenLayout

Using ScreenLayout Bitmask

雖然所有三個問題基本上是相同的,你真的需要兩個答案讓你的結果。

我用這個代碼讓我的活動裏面的佈局尺寸:

int layoutSize = getResources().getConfiguration().screenLayout; 
layoutSize = layoutSize & Configuration.SCREENLAYOUT_SIZE_MASK; 

第一行會返回版面大小,但是這將是一個數字,幾乎是int的最大尺寸。

第二行將與給定掩碼的佈局大小進行AND。掩碼的十進制值爲15,或十六進制的F值。

返回值介於0和3之間。對應於屏幕大小的值以及大小掩碼的值在android.content.res.Configuration類中定義爲常量:Android Configruation Documentation

所有你需要的前2行後做的是有某種爲SCREENLAYOUT_SIZE_XXX比較返回layoutSizeConfiguration的預定義值switch語句。

希望這不是太晚,您可以使用它。我的問題是,我不知道如何用確切的Android語言提問。這可能是爲什麼同樣的問題是,而且可能應該被問到這麼多種不同的方式。

31

一個非常簡單的方法來做到這一點,是由ID和標籤設置父佈局,並在您onCreate(),可以findViewById()getTag()

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/my_activity_view" 
    android:tag="big_screen" > 
     // misc views~ 
</RelativeLayout> 

,然後在你的onCreate方法,

if(findViewById(R.id.my_activity_view).getTag().equals("big_screen")) { 
    // do stuff 
} 
+2

非常好的建議,效果很好。 – Booger

+0

不工作,總是得到沒有Onclick的空指針(查看v) – delive

18

我有同樣的問題。如果您使用layout/layout-sw600dp/layout-sw720dp,下不限成員名額工作對我來說:

Configuration config = activity.getResources().getConfiguration(); 

if (config.smallestScreenWidthDp >= 720) { 
    // sw720dp code goes here 
} 
else if (config.smallestScreenWidthDp >= 600) { 
    // sw600dp code goes here 
} 
else { 
    // fall-back code goes here 
} 
+1

這應該是被接受的答案 – feresr

+0

是的,這應該是有效的答案。 –

3

下面的代碼將幫助你。我只是打印相應的屏幕尺寸或密度類別。你可以做任何你想做的事!

//Determine screen size 
    if ((getResources().getConfiguration().screenLayout &Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) 
    {  
     Log.d("Screen Size: ", "LARGE"); 

    } 
    else if ((getResources().getConfiguration().screenLayout &  Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {  
     Log.d("Screen Size: ", "NORMAL"); 

    } 
    else if ((getResources().getConfiguration().screenLayout &  Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {  
     Log.d("Screen Size: ", "SMALL"); 
    } 
    else if ((getResources().getConfiguration().screenLayout &  Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {  
     Log.d("Screen Size: ", "XLARGE"); 
    } 
    else { 
     Log.d("Screen Size: ","UNKNOWN_CATEGORY_SCREEN_SIZE"); 
    } 




    //Determine density 
    DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int density = metrics.densityDpi; 

     if (density==DisplayMetrics.DENSITY_HIGH) { 
      Log.d("Screen Density: ","HIGH"); 
     } 
     else if (density==DisplayMetrics.DENSITY_MEDIUM) { 
      Log.d("Screen Density: ","MEDIUM"); 
     } 
     else if (density==DisplayMetrics.DENSITY_LOW) { 
      Log.d("Screen Density: ","LOW"); 
     } 
     else if (density==DisplayMetrics.DENSITY_XHIGH) { 
      Log.d("Screen Density: ","XHIGH"); 
     } 
     else if (density==DisplayMetrics.DENSITY_XXHIGH) { 
      Log.d("Screen Density: ","XXHIGH"); 
     } 
     else { 
      Log.d("Screen Density: ","UNKNOWN_CATEGORY"); 
     } 
0

這是一個老問題,但我想和大家分享我的解決這一問題的辦法。

創建值 - *變型相匹配的設置,您希望以編程方式確定,在其內部將定義描述當前配置適當的值:

enter image description here

正如你所看到的,布爾值is_landscape都存在在值陸,因此,能夠經由安全訪問該R.bool.is_landscape

唯一的區別,雖然是值:

getResources().getBoolean(R.bool.is_landscape);評估爲true在橫向模式,並false否則。

注意:當然,這是可能的,以獲得當前設備方向使用getResources().getConfiguration().orientation,雖然我選擇使用這種簡單的熟悉的情況下,使我的例子清楚和直截了當的。

理解,這種技術是通用的是很重要的,使用它可以定義更復雜的值的資源的目錄,(例如值-ldrtl-sw600dp-V23)支持的更具體配置。

相關問題