如何以編程方式確定我的應用正在使用哪種佈局(佈局正常,佈局大等)?我看到getWindowManager()。getDefaultDisplay()。getMetrics(度量)調用,但它似乎只處理屏幕密度,但不需要應用程序使用哪種佈局。我需要的信息,因爲我需要在運行時動態地改變一些視圖的位置。如何以編程方式確定我的Android應用程序正在使用哪種XML佈局?
在此先感謝。
如何以編程方式確定我的應用正在使用哪種佈局(佈局正常,佈局大等)?我看到getWindowManager()。getDefaultDisplay()。getMetrics(度量)調用,但它似乎只處理屏幕密度,但不需要應用程序使用哪種佈局。我需要的信息,因爲我需要在運行時動態地改變一些視圖的位置。如何以編程方式確定我的Android應用程序正在使用哪種XML佈局?
在此先感謝。
爲什麼你不能把什麼位置的意見應該在xml中?這種方式時,特定的佈局類型被稱爲你不需要以編程方式做任何事情?
你可以使用不同的文件夾類型,如layout
,layout-sw600dp
,layout-sw720dp
等
看到http://developer.android.com/guide/topics/resources/providing-resources.html進行不同的配置
ViewGroup view = (ViewGroup)getWindow().getDecorView();
LinearLayout content = (LinearLayout)view.getChildAt(0);
int id = content.getId();
的ID告訴你哪個佈局你使用(假設你設定的XML中的id標籤)。
嗯。我試着用我的RelativeLayout視圖:'RelativeLayout content =(RelativeLayout)view.getChildAt(0);'它會導致一個類型轉換異常:'java.lang.ClassCastException:android.widget.FrameLayout'。任何想法爲什麼? – Kenny
我正在尋找相同的東西!我發現2類似questons /回答:
雖然所有三個問題基本上是相同的,你真的需要兩個答案讓你的結果。
我用這個代碼讓我的活動裏面的佈局尺寸:
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
比較返回layoutSize
與Configuration
的預定義值switch語句。
希望這不是太晚,您可以使用它。我的問題是,我不知道如何用確切的Android語言提問。這可能是爲什麼同樣的問題是,而且可能應該被問到這麼多種不同的方式。
一個非常簡單的方法來做到這一點,是由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
}
我有同樣的問題。如果您使用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
}
這應該是被接受的答案 – feresr
是的,這應該是有效的答案。 –
下面的代碼將幫助你。我只是打印相應的屏幕尺寸或密度類別。你可以做任何你想做的事!
//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");
}
這是一個老問題,但我想和大家分享我的解決這一問題的辦法。
創建值 - *變型相匹配的設置,您希望以編程方式確定,在其內部將定義描述當前配置適當的值:
正如你所看到的,布爾值is_landscape都存在在值和值陸,因此,能夠經由安全訪問該R.bool.is_landscape。
唯一的區別,雖然是值:
getResources().getBoolean(R.bool.is_landscape);
評估爲true
在橫向模式,並false
否則。
注意:當然,這是可能的,以獲得當前設備方向使用getResources().getConfiguration().orientation
,雖然我選擇使用這種簡單的熟悉的情況下,使我的例子清楚和直截了當的。
理解,這種技術是通用的是很重要的,使用它可以定義更復雜的值的資源的目錄,(例如值-ldrtl-sw600dp-V23)支持的更具體配置。
我確實使用了不同的佈局文件夾(不能使用swxxxdp,因爲我需要保持與2.x兼容),這就是爲什麼我需要知道應用程序使用哪個佈局文件夾。基於用戶操作,我有一些視圖元素需要在運行時動態顯示。 – Kenny
以及如果你使用不同的文件夾,那麼你應該沒有問題,因爲操作系統根據設備選擇使用哪種佈局。例如,如果用戶擁有一臺被認爲是「大」或VGA的設備,那麼它將使用'layout-large'文件夾中的佈局。你只需要確保每個文件夾中的文件都是相同的。我知道你不需要做所有這些額外的東西,你認爲你做了 – tyczj
瞭解。但是我的觀點並不是XML的一部分,需要根據所選的屏幕大小/佈局在運行時略有不同,這就是爲什麼我需要知道哪一個被使用,以便我可以調整和添加視圖因此。我已經將「基準」XML命名爲相同,但在每個layout-xyz文件夾中實現方式略有不同。 – Kenny