如何让RelativeLayout使用merge和include?

我已经尝试了几天现在,使我的布局更有效的转换使用几个嵌套的LinearLayouts级别为一个RelativeLayout ,并遇到了一些问题,我还没有find解决方法…

我已经search了Android初学者组和这个网站,一直没能find任何可以帮助我解决问题的东西。

我在其中一个博客上看过,你可以将布局与合并和包含标签结合起来。 所以我所拥有的是一个带有RelativeLayout根元素的主布局文件。 里面有5个include标签,引用5个不同的xml布局文件,每个文件都有一个根元素的合并元素(我的所有合并文件都是相同的,除了在他们的ID)。

我遇到了两个问题,我将在发布我的布局代码的简化版本后解释:

样品主布局文件:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/translucent_gray" > <include android:id="@+id/running_gallery_layout_id" layout="@layout/running_gallery_layout" /> <include android:id="@+id/recent_gallery_layout_id" layout="@layout/recent_gallery_layout" android:layout_below="@id/running_gallery_layout_id" /> <include android:id="@+id/service_gallery_layout_id" layout="@layout/service_gallery_layout" android:layout_below="@id/recent_gallery_layout_id" /> <include android:id="@+id/process_gallery_layout_id" layout="@layout/process_gallery_layout" android:layout_below="@id/service_gallery_layout_id" /> </RelativeLayout> 

样本包含合并文件:

 <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView style="@style/TitleText" android:id="@+id/service_gallery_title_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:text="@string/service_title" /> <Gallery android:id="@+id/service_gallery_id" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_below="@id/service_gallery_title_text_id" /> <TextView style="@style/SubTitleText" android:id="@+id/service_gallery_current_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/service_gallery_title_text_id" android:layout_above="@id/service_gallery_id" /> </merge> 

我遇到了两个问题:

1)在include标记中使用android:layout_*属性似乎被忽略,并且所有合并的布局显示在彼此之上。 根据这篇文章( http://developer.android.com/resources/articles/layout-tricks-reuse.html ),任何android:layout_*属性都可以和<include />标签一起使用“

2)由于我无法得到这个工作,我决定尝试添加一个android:layout_below属性到每个合并布局文件中的第一个TextView项目,这意味着每个合并文件将引用另一个合并布局文件中的一个ID …对于大部分这实际上工作,我的布局看起来不错。 然而,我得到一个android:layout_below属性之一的错误,说它找不到我指定的ID …我有双重和三重检查ID确保他们是正确的。 最奇怪的部分是我使用AutoFillfunction将id放在属性中的第一位。

如果任何人有任何build议或变通办法,我将非常乐意尝试。 此外,如果任何人都可以想办法让我只有一个合并的XML布局文件,而不是5,将不胜感激。 我找不到这样做的方法,因为我需要在运行时访问合并布局文件中的每个项目…

include标签有问题。 检查: https : //issuetracker.google.com/issues/36908001

为了解决这个问题,确保你在layout_height时候覆盖layout_widthlayout_height ,否则一切都会被忽略。

看到下面更高的投票答案。 我的过分悲伤


我可以解决Justin提出的一个问题:RelativeLayout无法pipe理include的定位(至less在1.6这个简单的例子中)

CommonsWarebuild议将这个包装包装在一个独特的父容器中,但是这样做是为了协助在Justin's包含内命名相同的命名

每个必须有一个唯一的父容器,并且您将在该容器(ViewGroup)而不是Activity上调用findViewById()。

事实上,你也必须这样做才能让RelativeLayout的行为像预期的那样:

这个工程( 页脚是很好定位):

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <include android:id="@+id/header" layout="@layout/header" android:layout_alignParentTop="true" /> <WebView android:id="@+id/webView" android:layout_below="@id/header" android:background="#77CC0000" android:layout_height="wrap_content" android:layout_width="fill_parent" android:focusable="false" /> <LinearLayout android:layout_alignParentBottom="true" android:layout_height="wrap_content" android:layout_width="fill_parent"> <include android:id="@+id/footer" layout="@layout/footer" /> </LinearLayout> </RelativeLayout> 

这不( 页脚浮在屏幕顶部):

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <include android:id="@+id/header" layout="@layout/header" android:layout_alignParentTop="true" /> <WebView android:id="@+id/webView" android:layout_below="@id/header" android:background="#77CC0000" android:layout_height="wrap_content" android:layout_width="fill_parent" android:focusable="false" /> <include android:id="@+id/footer" layout="@layout/footer" android:layout_alignParentBottom="true" /> </RelativeLayout> 

如果没有周围的LinearLayout,光秃秃的footer包括不会alignment父母的底部。我不会调用这个预期的行为。

此外,WebView似乎很好地附加到标题的ID,但我相信这是错觉,因为它简单地垂直下方的标题。 我也尝试在页脚的上方设置一个button,但是它也有所有浮动和错误

RelativeLayout在1.5中有更多的问题,但我仍然喜欢它:)

男人,这是旧的,但似乎出现在search的顶部,所以我要评论。

我认为这里的诀窍是<merge>标签和<include> <merge>标签结合在一起实质上删除了该级别的任何一种“父”视图组。 那么,你到底在问谁“layout_below”其他人呢? 没有人。 这个级别没有看法。

<merge>标签取得子视图,并将它们直接popup到<include>标签的父项中。 因此,您必须要求您包括的布局中的孩子相应地固定自己。

为了在RelativeLayout上进行定位,您需要在包含文件中设置layout_ *参数,而不是在主布局文件中。 那样

main_layout.xml

 <RelativeLayout android:id="@+id/header" android:layout_width="fill_parent" android:layout_height="wrap_content"> .... </RelativeLayout> <RelativeLayout android:id="@+id/footer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> ..... </RelativeLayout> <include layout="@layout/content_layout" /> 

content_layout.xml

 <merge xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/footer" android:layout_below="@id/header" > .... </RelativeLayout> </merge> 

这显然不是我们开发人员想要的,但这是我发现的避免重复XML的唯一解决scheme

在include标签中使用android:layout_ *属性似乎被忽略,并且所有合并的布局显示在彼此之上。

我的猜测是,你不能从布局规则中引用在<include>元素上定义的android:id属性,只有在“真实”的小部件和容器上的属性。

此外,如果任何人都可以想办法让我只有一个合并的XML布局文件,而不是5,将不胜感激。

简单:把他们全部放在一个文件中。

我找不到这样做的方法,因为我需要在运行时访问合并布局文件中的每个项目

无论你有一个<include>元素还是1,000,所有的内容都应该在运行时被访问。 一个例外是,如果你有重复的android:id属性 – 你需要正确地调整你的findViewById()调用来获得正确的调用,就像从ListView行获得小部件时一样。

如果您可以创build一个使用2+合并文件的示例项目,您可以在运行时演示内容不可访问,请告诉我。

在我的情况下,我试图包含的布局开始于<merge tag。 当我改变它的布局,说<RelativeLayout它的工作。 下面是插图。

加工

 <RelativeLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:showIn="@layout/activity_home"> 

不工作

 <merge xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:showIn="@layout/activity_home">