了解运行时使用的布局

时间:2012-07-11 21:35:38

标签: android layout

我有两个用于测试的Android设备。一个是分辨率480x320,另一个是800x480。我在layout-normal和layout目录中定义了不同的布局。我也尝试过layout-hdpi,layout-mdpi等不同的组合。

有没有办法从某个地方的日志中知道设备在哪种布局类别中仅用于调试目的。我想知道布局文件在运行时使用的目录。如果没有,那么有人可以告诉我具有前面提到的分辨率的两个设备的布局目录的正确组合。

提前致谢。

2 个答案:

答案 0 :(得分:9)

在运行时使用哪个布局(来自layout-ldpilayout-mdpi文件夹等...)。您可以在布局上使用tag属性。例如,假设您已为不同的屏幕定义了两个布局,一个位于layout-mdpi文件夹中,另一个位于layout-hdpi文件夹中。像这样:

<?xml version="1.0" encoding="utf-8"?>
<!--Layout defined in layout-mdi folder-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MainLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:tag="mdpi"
    android:orientation="horizontal" >

    <!-- View and layouts definition-->
<!LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<!--Corresponding Layout defined in layout-hdi folder-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MainLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:tag="hdpi"
    android:orientation="horizontal" >

    <!-- View and layouts definition-->
<!LinearLayout>

要检查运行时使用的布局,可以使用以下内容:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.MainLayout);
if(linearLayout.getTag() != null) {

   String screen_density = (String) linearLayout.getTag();
}

if(screen_density.equalsIgnoreCase("mdpi") {
   //layout in layout-mdpi folder is used
} else if(screen_density.equalsIgnoreCase("hdpi") {
   //layout in layout-hdpi folder is used
}

答案 1 :(得分:1)

以下是@Angelo的答案的扩展,可能会根据您使用元素的方式起作用:在每个文件中,如果您具有不需要操作的相同元素,则可以为每个元素指定一个不同的ID您定义的布局(而不是标记它)。

例如,假设我不需要操纵基本线性布局,我只需要操纵其中的视图。

这是我的hdpi布局:

<?xml version="1.0" encoding="utf-8"?>
<!--Corresponding Layout defined in layout-hdpi folder-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout-hdpi"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
    <!-- View and layouts definition-->
</LinearLayout>

继承人的mdpi布局:

<?xml version="1.0" encoding="utf-8"?>
<!--Corresponding Layout defined in layout-mdpi folder-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout-mdpi"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
    <!-- View and layouts definition-->
</LinearLayout>

这是我的代码,它决定了它的布局:

if ( findViewById(R.id.layout-hdpi) != null ) {
    //we are in hdpi layout
} else if ( findViewById(R.id.layout-mdpi) != null ) {
    //we are in mdpi layout
}

这个想法是,您在不同文件中为该项目定义的ID中只有一个实际存在,并且无论哪个人在实际加载的布局中都这样做。需要注意的是,如果你以后真的需要操作该项,这种方法会带来很多额外的工作,可能并不理想。您不希望在诸如EditText之类的项目上使用此技术,因为您必须检查您所在的布局以决定使用哪个ID来获取该编辑文本。