Android如何在布局中渲染视图?

时间:2013-11-09 18:31:03

标签: android xml android-layout

我遇到了(我认为)简单的LinearLayout问题。 (很长的问题 - 对不起)我有一个带有RelativeLayout的XML布局,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:id="@+id/display_Player_Init"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="Player" />

    <TextView
        android:id="@+id/display_USGA_Index"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="5dp"
        android:gravity="right"
        android:layout_toRightOf="@+id/display_Tees"
        android:text="IDX" />

    <TextView
        android:id="@+id/display_Course_HCP"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="5dp"
        android:gravity="right"
        android:layout_toRightOf="@+id/display_USGA_Index"
        android:text="HCP" />

    <TextView
        android:id="@+id/display_Course"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="5dp"
        android:layout_toRightOf="@+id/display_Player_Init"
        android:text="Course" />

    <TextView
        android:id="@+id/display_Tees"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="5dp"
        android:layout_toRightOf="@+id/display_Course"
        android:text="Tees" />

</RelativeLayout>

这在IDE预览中正确显示如下:

废话,没有足够的代表点发布图片。

应用程序正确显示(注意5个值的顺序):

没有足够的代表点发布图片。

RelativeLayout看起来过于笨重,我想使用更简单的LinearLayout,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    >

    <TextView
        android:id="@+id/display_Player_Init"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:text="Player" />

    <TextView
        android:id="@+id/display_USGA_Index"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:gravity="right"
        android:text="IDX" />

    <TextView
        android:id="@+id/display_Course_HCP"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:gravity="right"
        android:text="HCP" />

    <TextView
        android:id="@+id/display_Course"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="Course" />

    <TextView
        android:id="@+id/display_Tees"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="Tees" />

</LinearLayout>

在IDE中正确预览的内容如下(请注意,第一个布局中的字段无序。我即将更正):

没有足够的代表点发布图片。

并在应用中正确呈现如下:

没有足够的代表点发布图片。

现在,当我在LinearLayout XML中更改TextViews的顺序时,它呈现就好像字段中显示了错误的值一样。这是XML:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    >

    <TextView
        android:id="@+id/display_Player_Init"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:text="Player" />

    <TextView
        android:id="@+id/display_Course"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="Course" />

    <TextView
        android:id="@+id/display_Tees"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="Tees" />

    <TextView
        android:id="@+id/display_USGA_Index"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:gravity="right"
        android:text="IDX" />

    <TextView
        android:id="@+id/display_Course_HCP"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:gravity="right"
        android:text="HCP" />

</LinearLayout>

这是(正确的)IDE预览: 没有足够的回复点来发布图片。

但是,这是应用渲染:

没有足够的回复点来发布图片。 它将字符串“ABC CC”放在右列并将其包装好像将字符串放在HCP字段中一样。

请注意,字段顺序正确,但值会以某种方式切换。 XML字段以正确的顺序呈现,但字段的值为:Name,Index,Tees,HCP,Course,其值为“course”,其宽度为HCP字段的宽度。

这些示例之间没有更改代码,因此看起来xml导致了问题。谁能帮我理解为什么? (抱歉没有图片。)

感谢。

1 个答案:

答案 0 :(得分:1)

使用android:id=将资源ID分配给UI元素(如TextView)时,会在R.java文件中创建一个int数据字段。

R.java文件可以在项目的/ gen目录中找到,与该目录中的所有文件一样,它在构建时自动生成。

有时,如果重新处理资源文件(例如布局XML文件),之前已分配给一个资源(例如TextView)的int值可能会引用另一个资源,即另一个TextView。这意味着当你使用类似findViewById(...)的东西时,即使R.id指的是你想要的UI元素,实际的int资源id也指向不同的东西。

解决此类问题的最简单方法是清理项目 - 这会删除所有自动生成的文件并重新创建它们并重新构建项目。