我一直在尝试了几天,现在让我的布局,更有效的通过使用嵌套的几个层次转换LinearLayouts
一个RelativeLayout
和所遇到的一些问题,我的天堂没有能够找到一个解决方法...
我已经搜索了Android初学者组,本网站一直没能找到任何能帮助我解决这个问题。
我读的,你可以与合并相结合的布局,包括标签的博客之一。 所以,我有什么是有一个主要布局文件RelativeLayout
根元素。 里面的,我有5包括引用各有一个合并元素为根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) 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
功能来把ID的属性摆在首位。
如果任何人有任何建议或解决方法我会更乐意尝试出来。 此外,如果任何人都可以想到的办法,我只是有一个合并XML布局文件,而不是5,将不胜感激。 我无法找到一个方法来做到这一点,因为我需要在运行时访问每个项目在合并布局文件...
Answer 1:
没有与包括标签的问题。 检查: https://issuetracker.google.com/issues/36908001
为了解决这个问题,请确保您覆盖BOTH layout_width
和layout_height
包括何时,否则一切都将被忽略。
Answer 2:
请参阅下面的更高投票的答案。 煤矿是远远过时
我可以解决一个问题, 贾斯汀提出:无力的RelativeLayout进行管理的定位包括(至少在这个简单的例子,在1.6模拟器)
CommonsWare建议包裹包括一个独特的父容器,但为了协助解决与划定范围内贾斯汀包括同名的意见这样做
每个必须具有唯一父容器,你会说这就是容器findViewById()(ViewGroup中),而不是上的活动。
事实上,你也必须这样做才能得到的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 ..我不会把这个预期的行为。
此外,WebView中似乎本身ID很好地附着在头 ,但我相信这是错觉,因为它只是垂直流动的标题下方。 我也试着设置一个按钮正上方的页脚包括,但它得到了所有轻飘和错误的,太
的RelativeLayout有更多的问题在1.5,但我仍然喜欢它:)
Answer 3:
男人,这是旧的,但它似乎要拿出在搜索的顶部,所以我要发表评论。
我觉得这里的诀窍是, <merge>
标签与结合<include>
标签在这一水平基本上除去任何形式的“家长”视图组。 那么,到底谁是你问到“layout_below”别人呢? 没有人。 有一个在该级别没有意见。
该<merge>
标签带有孩子的意见,并将其弹出右转入的父<include>
标签。 因此,你必须问在布局其子你包括相应锚自己。
Answer 4:
对于定位于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的唯一解决方案
Answer 5:
Android的:layout_ *属性似乎在包括标签使用,所有合并的布局显示在彼此的顶部时被忽略。
我的猜测是,你不能引用,从布局规则, android:id
被定义属性<include>
元素,只有那些上“真正的”小工具和容器。
此外,如果任何人都可以想到的办法,我只是有一个合并XML布局文件,而不是5,将不胜感激。
很简单:把他们都在一个文件中。
我无法找到一个方法来做到这一点,因为我需要在运行时访问每个项目在合并布局文件
无论你是否有一个<include>
元素或1000,所有的内容应该是在运行时访问。 一个例外是,如果你有重复android:id
属性-你需要适当范围的findViewById()
调用来获得正确的,就像你从一个ListView行widget的时候。
如果你能创建使用2+合并文件,你可以证明的内容是不能在运行时访问的示例项目,让我知道。
Answer 6:
就我而言,我试图包括与开始布局<merge
标签。 当我把它改成一个布局,说<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">
Answer 7:
我有同样的问题,甚至定义layout_width
和layout_height
没有奏效。 问题是,我是其中的布局有标签和删除它们之后,一切工作就像一个魅力。 我想,合并不是一个布局标签正因为如此,它不能接收定位和尺寸参数。 既然你定义在一切都转移到内部父布局,设置了刚刚扔掉。
TL:DR:只需删除标记,移动的xmlns定义,以真正的布局viewholder,你应该是不错的。
之前:
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<...ui.component.BorderCardView
android:layout_width="112dp"
android:layout_height="32dp"
app:cardCornerRadius="4dp"
app:cardUseCompatPadding="true">
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:src="@drawable/ic_logout"
android:tint="@color/divider" />
</...ui.component.BorderCardView>
</merge>
工作:
<...ui.component.BorderCardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="112dp"
android:layout_height="32dp"
app:cardCornerRadius="4dp"
app:cardUseCompatPadding="true">
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:src="@drawable/ic_logout"
android:tint="@color/divider" />
</...ui.component.BorderCardView>
文章来源: How to get RelativeLayout working with merge and include?