我怎样才能检测到我的应用程序Androidselect哪个布局?

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

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

在不同的设备和不同的位置,其中一个是由Androidselect的。
我怎样才能找出哪一个是编程select?

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


编辑 : Graham Borland的解决scheme在我提到的一些情况下有问题。

Solutions Collecting From Web of "我怎样才能检测到我的应用程序Androidselect哪个布局?"

您可以为每个受支持的configuration创build一个values-<config>目录。 在每个目录内部,创build一个带有单个selected_configurationstring的strings.xml ,它描述了当前的configuration。 在运行时,使用标准的getString方法获取string,该方法将为您执行configurationparsing并为configuration返回正确的string。 这是未经testing的。

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

例:

布局XLARGE土地/ my_act.xml

 <View android:id="@+id/mainview" android:tag="xlarge-landscape" /> 

布局XLARGE / my_act.xml

 <View android:id="@+id/mainview" android:tag="xlarge-portrait" /> 

MyActivity.java

 String tag = view.getTag(); if (tag.equals("xlarge-landscape") { ... } 

您可以尝试重复使用“Android如何find最佳匹配资源”这一algorithm – 这非常简单,特别是如果只有不同的屏幕有不同的布局。

我的答案是从@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; } 

这将在API lavel 4或更高版本中工作。

我假设你正在使用setContentView(int resID)来设置你的活动的内容。


方法1 (这是我的答案)

现在在所有的布局中,确保根视图总是有正确的标记:

例:

layout-xlarge/main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:tag="xlarge-landscape" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> 

layout-small/main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:tag="small" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> 

现在让您的活动扩展此活动:

 package shush.android.screendetection; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class SkeletonActivity extends Activity { protected String resourceType; @Override public void setContentView(int layoutResID) { LayoutInflater inflater = getLayoutInflater(); View view = inflater.inflate(layoutResID, null); resourceType = (String)view.getTag(); super.setContentView(view); } } 

在这种情况下,您可以使用resourceType来了解使用的资源标识符是什么。


方法2 (这是我的答案,但在发布之前,我想到了更好的一个)

现在在所有的布局中,确保根视图总是有正确的标记:

例:

layout-xlarge/main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:tag="xlarge-landscape" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> 

layout-small/main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:tag="small" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> 

现在让您的活动扩展此活动:

 package shush.android.screendetection; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class SkeletonActivity extends Activity { @Override public void setContentView(int layoutResID) { LayoutInflater inflater = getLayoutInflater(); View view = inflater.inflate(layoutResID, null); fix(view, view.getTag()); super.setContentView(view); } private void fix(View child, Object tag) { if (child == null) return; if (child instanceof ViewGroup) { fix((ViewGroup) child, tag); } else if (child != null) { child.setTag(tag); } } private void fix(ViewGroup parent, Object tag) { for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); if (child instanceof ViewGroup) { fix((ViewGroup) child, tag); } else { fix(child, tag); } } } } 

在这种情况下,您的层次结构中的所有视图都将具有相同的标记。

我不知道确切的方式来find它。 但是我们可以用不同的方式find它。

在所有布局中添加一个文本视图(可见性隐藏)。 像xlarge,land,xlarge-land那样分配值。

在程序中,从textview中获取值。 不知何故,我们可以像这样知道。

您可以从Resources对象获取有关屏幕方向和大小的信息。 从那里你可以了解使用哪种布局。

getResources().getConfiguration().orientation; – 返回Configuration.ORIENTATION_PORTRAITConfiguration.ORIENTATION_LANDSCAPE

int size = getResources().getConfiguration().screenLayout; – 返回屏幕大小的掩码。 您可以针对Small,Normal,Large和xLarge大小进行testing。 例如:

 if ((size & Configuration.SCREENLAYOUT_SIZE_XLARGE)==Configuration.SCREENLAYOUT_SIZE_XLARGE) 

你的问题是一样的这个如何获得布局XML文件path?
您可以添加一个隐藏的文本视图与相应的文件夹名称在xml文本视图中获取string

 TextView path = (TextView)findViewbyid(R.id.hiddentextview); String s = path.gettext().tostring(); 

确保文本视图的所有ID都是相同的。

 if your xml is in `normal-mdpi` in hidden textview hard code `normal-mdpi` if your xml is in `large-mdpi` in hidden textview hard code `large-mdpi`