如何在我的应用程序中检测Android选择的布局?

Bob*_*obs 68 resources android android-layout

假设我在不同的资源文件夹中有三种不同布局的活动.例如:

layout-land/my_act.xml
layout-xlarge/my_act.xml
layout-xlarge-land/my_act.xml

在不同的设备和不同的位置,其中一个由Android选择.
如何找出以编程方式选择的?

Android是否有任何API将这些布局返回给程序?


编辑:Graham Borland的解决方案在我在评论中提到的某些情况下存在问题.

Gra*_*and 70

您可以android:tag在每个不同的资源文件中的视图上设置不同的属性,并在运行时使用View.getTag().

例:

布局XLARGE土地/ my_act.xml

<View
    android:id="@+id/mainview"
    android:tag="xlarge-landscape"
/>
Run Code Online (Sandbox Code Playgroud)

布局XLARGE/my_act.xml

<View
    android:id="@+id/mainview"
    android:tag="xlarge-portrait"
/>
Run Code Online (Sandbox Code Playgroud)

MyActivity.java

String tag = view.getTag();
if (tag.equals("xlarge-landscape") {
    ...
}
Run Code Online (Sandbox Code Playgroud)


Edw*_*ale 42

您可以values-<config>为每个支持的配置创建一个目录.在每个目录中,strings.xml使用单个selected_configuration字符串创建一个描述当前配置的字符串.在运行时,使用标准getString方法获取字符串,该方法将为您执行配置解析并为配置返回正确的字符串.这是未经测试的.


Jin*_*n35 8

你可以尝试重复这个算法"Android如何找到最匹配的资源" - 这很简单,特别是如果你有不同的布局只针对不同的屏幕.


Din*_*esh 5

我的回答是从@Graham Borland实现的

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        switch(metrics.densityDpi){
             case DisplayMetrics.DENSITY_LOW:

             if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
             {
               Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
               String tag = view.getTag();
               if (tag.equals("small-landscape") {
                .....
              }
             } 
            else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
            {
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
             String tag = view.getTag();
               if (tag.equals("small-potrait") {
                .....
              }
            }
            break;

             case DisplayMetrics.DENSITY_MEDIUM:

             if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
             {
               Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
               String tag = view.getTag();
               if (tag.equals("medium-landscape") {
                .....
              }
             } 
            else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
            {
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
             String tag = view.getTag();
               if (tag.equals("medium-potrait") {
                .....
              }
            }
             break;

             case DisplayMetrics.DENSITY_HIGH:

               if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
             {
               Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
               String tag = view.getTag();
               if (tag.equals("large-landscape") {
                .....
              }
             } 
            else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
            {
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
             String tag = view.getTag();
               if (tag.equals("large-potrait") {
                .....
              }
            }
             break;
        }
Run Code Online (Sandbox Code Playgroud)

这将适用于API lavel 4或更高版本.