2012-05-21 23 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)支持的更具体配置。

相关问题