2

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

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

提前致谢。

4

2 回答 2

9

查找运行时使用的布局(来自layout-ldpilayout-mdpi文件夹等)。您可以在布局中使用标签属性。例如,假设您为不同的屏幕定义了两种布局,一种在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
}
于 2012-07-11T22:14:48.220 回答
1

这是@Angelo's answer的扩展,可能会根据您使用元素的方式起作用:在每个文件中,如果您有不需要操作的相同元素,则可以为您定义的每个布局赋予不同的 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 中只有一个实际存在,并且无论哪个 ID 都在实际加载的布局中。需要注意的是,如果您以后确实需要操作该项目,则此方法会产生大量额外工作,并且可能并不理想。您不希望在诸如 EditText 之类的项目上使用此技术,因为您必须检查您所处的布局以决定使用哪个 id 来获取该编辑文本。

于 2013-02-28T14:27:00.823 回答