如何让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确保他们是正确的。 最奇怪的部分是我使用AutoFill
function将id放在属性中的第一位。
如果任何人有任何build议或变通办法,我将非常乐意尝试。 此外,如果任何人都可以想办法让我只有一个合并的XML布局文件,而不是5,将不胜感激。 我找不到这样做的方法,因为我需要在运行时访问合并布局文件中的每个项目…
include标签有问题。 检查: https : //issuetracker.google.com/issues/36908001
为了解决这个问题,确保你在layout_height
时候覆盖layout_width
和layout_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">