如何获得的RelativeLayout与合并,包括工作?如何获得的RelativeLayout与合并

2019-05-13 04:16发布

我一直在尝试了几天,现在让我的布局,更有效的通过使用嵌套的几个层次转换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_widthlayout_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_widthlayout_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?