如何在FrameLayout中将元素对齐到右侧?

21

我有一个FrameLayout,其中包含2个视图,第二个视图类似于一个“关闭按钮(X)”,我想将其定位到右侧。

我尝试了layout_gravity = "right",但没有起作用。

这是我的layout xml:

<FrameLayout android:layout_width="320dp"
    android:layout_height="wrap_content"
    android:id="@+id/layoutSmallImg">

    <ImageView android:id="@+id/bigImage"
        android:layout_width="320dp" android:layout_height="wrap_content"/>

    <ImageView android:id="@+id/bigImage"
        android:layout_width="320dp" android:layout_height="wrap_content"/>

    <ImageButton android:id="@+id/closebutton"
        android:background="@android:color/transparent"
        android:layout_height="30dp" android:layout_marginTop="10dp"
        android:layout_alignParentRight="true"
        android:layout_width="30dp" android:paddingLeft="40dp"
        android:visibility="gone" 
        android:src="@drawable/close" />
</FrameLayout>
6个回答

33

我建议您使用 RelativeLayout 代替。

FrameLayout 的设计是为了在屏幕上阻挡出一个区域以显示单个项。 您可以向 FrameLayout 添加多个子项,并使用重力控制它们在 FrameLayout 中的位置。子元素按照堆栈的形式绘制,最近添加的子元素位于顶部。FrameLayout 的大小是其最大子元素的大小(加上填充),无论是否可见(如果 FrameLayout 的父元素允许)。如果将 setConsiderGoneChildrenWhenMeasuring() 设置为 true,则用于尺寸调整的 GONE 视图仅用于大小。

顺便问一下,您希望按钮在 ImageView 上方还是旁边?您正在将布局和 imageView 的宽度设置为相同的大小。


在评论之后,我看到两个选项:


谢谢您的回答,我知道可以使用RelativeLayout实现,但我想在FrameLayout中对齐它,:( 是的,我希望将imageButton放置在imageView的顶部|右侧,它看起来像是我的图像的关闭按钮,当我点击时,图像会淡出。 - Houcine
谢谢你的时间,我想我会再次使用RelativeLayout进行工作,我没有在FrameLayout中找到我的满足感。 - Houcine

30

阅读文档:

FrameLayout旨在屏蔽屏幕上的某个区域以显示一个单独的项。通常,FrameLayout应该用于容纳单个子视图,因为很难组织子视图以适应不同屏幕大小而不重叠。然而,您可以将多个子项目添加到FrameLayout中,并通过为每个子项分配重力属性(使用android:layout_gravity属性)来控制它们在FrameLayout中的位置。

尝试:

<TextView
     .....
     android:layout_gravity="right" />
您可以在FrameLayout中的9个不同位置放置视图。
祝您愉快。

这个可以运行。我相信RelativeLayout比FrameLayout更昂贵,需要更多的布局。 - Jon Willis
1
谢谢!这解决了RelativeLayout占据整个屏幕的问题。https://dev59.com/T2w15IYBdhLWcg3wo9Rx - Boris Treukhov

9

将您的元素放置在第二个RelativeLayout中的FrameLayout中。并使用android:layout_alignParentRight="true"来对齐您想要向右对齐的元素。

<FrameLayout android:layout_width="320dp" android:layout_height="wrap_content" 
                                      android:id="@+id/layoutSmallImg">
 <RelativeLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
    <ImageView android:id="@+id/bigImage"
            android:layout_width="320dp" 
            android:layout_height="wrap_content"/>

    <ImageButton android:id="@+id/closebutton"
            android:background="@android:color/transparent"
            android:layout_height="30dp" android:layout_marginTop="10dp"
            android:layout_alignParentRight="true"
            android:layout_width="30dp" android:paddingLeft="40dp"
            android:visibility="gone" 
            android:src="@drawable/close" />
  </RelativeLayout>
</FrameLayout>

1
以编程方式,您可以使用FrameLayout.LayoutParams来设置边距。以下代码可将视图放置在屏幕底部:
int desired_height_of_content = //whatever your want the height of your view to be
FrameLayout layout = new FrameLayout(this);
FrameLayout.LayoutParams flp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, desired_height_of_content);
int difference = screen_height - desired_height_of_content
flp.setMargins(difference, 0, 0, 0);
layout.addView(your_view, flp);

1

2
谢谢你的回答,我知道可以使用RelativeLayout实现,但是我想在FrameLayout中对齐它,:( - Houcine
1
然后在您的视图中添加左边距 - Diego Torres Milano

0
你想使用FrameLayout还是RelativeLayout?
据我理解,如果你想用另一个视图替换当前视图,就应该使用FrameLayout。而RelativeLayout可以满足你的需求。

谢谢您的回复。 我想使用FrameLayout,默认情况下,FrameLayout会将视图定位在框架布局的左上角,但我想将其放在右上角。 - Houcine
你也可以使用FrameLayout来实现你想要的效果。将ImageButton的layout_gravity设置为“right”。layout_alignParentRight仅适用于RelativeLayout,我不确定它是否也适用于FrameLayout。有没有其他人能够解答一下这个问题。 - varuaa
谢谢,但我已经尝试了layout_gravity="right",但它没有起作用 :) - Houcine
我实际上复制了你的代码,只是删除了android:visibility="gone"这一行。然后我添加了layout_gravity="right"。对我来说它完美地工作了。只是我的手机屏幕尺寸不是很大,所以我得到了一个被切割了一半的图像,但是我确实把它对齐到右边了,所以它运行得很好 :) - varuaa
是的,我知道,我看到我的逻辑足够好,可以将ImageButton对齐到右侧,但最终,我使用了RelativeLayout,关键是现在它能正常工作 :) 感谢您的时间 ;) - Houcine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接