Android:SlidingDrawer的高度可以用wrap_content设置吗?
我正在尝试实现一个 SlidingDrawer
,它将占据整个屏幕宽度,但其高度由其内容动态确定:换句话说,标准 fill_parent
布局行为宽度和高度的 wrap_content
。这正是我在布局 XML 中指定的方式(见下文),但滑动抽屉始终打开到全屏高度。我的内容的高度各不相同,但通常只有屏幕高度的一半左右,因此最终在其下方有一个很大的间隙。我想要的是将内容整齐地放置在屏幕底部。
我已经尝试了所有我能想到的方法来修复它,但到目前为止没有任何效果。如果我将 SlidingDrawer
的 layout_height
设置为特定值(例如 160dip
),它可以工作,但这不是我需要的:它必须是动态的。当然,我已确保所有子元素的高度也设置为 wrap_content
。
SlidingDrawer 的文档对此有点模糊,我也找不到任何可以实现我所追求的示例。如果有人能看到我哪里出错了,我将非常感谢你的帮助!
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ViewFlipper
android:id="@+id/ImageFlipper"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/imageView0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="centerCrop" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="centerCrop" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="centerCrop" />
</ViewFlipper>
<SlidingDrawer
android:id="@+id/infoDrawer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:handle="@+id/infoDrawerHandle"
android:content="@+id/infoDrawerContent"
android:allowSingleTap="false"
android:layout_alignParentBottom="true"
android:orientation="vertical" >
<!-- Sliding drawer handle -->
<ImageView
android:id="@id/infoDrawerHandle"
android:src="@drawable/info_handle_closed"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- Sliding drawer content: a scroller containing a group of text views
laid out in a LinearLayout -->
<ScrollView
android:id="@id/infoDrawerContent"
android:background="@drawable/info_background"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fillViewport="false" >
<LinearLayout
android:id="@id/infoDrawerContent"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="5dip" >
<TextView
android:id="@+id/infoTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="16dip"
android:textStyle="bold" />
<TextView
android:id="@+id/infoCreator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="14dip"
android:textStyle="italic"
android:paddingBottom="10dip" />
<TextView
android:id="@+id/infoDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="14dip"
android:paddingBottom="10dip" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffcc00"
android:textSize="14dip"
android:textStyle="bold"
android:text="@string/heading_pro_tip" />
<TextView
android:id="@+id/infoProTip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffcc00"
android:textSize="14dip" />
</LinearLayout>
</ScrollView>
</SlidingDrawer>
</RelativeLayout>
I'm trying to implement a SlidingDrawer
that will occupy the full screen width, but whose height is determined dynamically by its contents: in other words, standard fill_parent
layout behaviour for the width and wrap_content
for the height. That's exactly how I've specified it in the layout XML (see below) but the sliding drawer always opens to the full screen height. The height of my content varies, but typically it's only about half the screen height, so I end up with a big gap underneath it. What I'd like is for the content to sit neatly on the bottom of the screen.
I've tried everything I can think of to fix it but nothing's worked so far. If I set the SlidingDrawer
's layout_height
to a specific value (e.g. 160dip
) it works, but that's not what I need: it has to be dynamic. Of course I've made sure all the child elements have their height set to wrap_content
too.
The documentation on SlidingDrawer is a bit vague on this and I haven't been able to find any examples that do what I'm after either. If anyone can see where I'm going wrong I'd really appreciate your help!
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ViewFlipper
android:id="@+id/ImageFlipper"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/imageView0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="centerCrop" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="centerCrop" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="centerCrop" />
</ViewFlipper>
<SlidingDrawer
android:id="@+id/infoDrawer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:handle="@+id/infoDrawerHandle"
android:content="@+id/infoDrawerContent"
android:allowSingleTap="false"
android:layout_alignParentBottom="true"
android:orientation="vertical" >
<!-- Sliding drawer handle -->
<ImageView
android:id="@id/infoDrawerHandle"
android:src="@drawable/info_handle_closed"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- Sliding drawer content: a scroller containing a group of text views
laid out in a LinearLayout -->
<ScrollView
android:id="@id/infoDrawerContent"
android:background="@drawable/info_background"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fillViewport="false" >
<LinearLayout
android:id="@id/infoDrawerContent"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="5dip" >
<TextView
android:id="@+id/infoTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="16dip"
android:textStyle="bold" />
<TextView
android:id="@+id/infoCreator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="14dip"
android:textStyle="italic"
android:paddingBottom="10dip" />
<TextView
android:id="@+id/infoDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="14dip"
android:paddingBottom="10dip" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffcc00"
android:textSize="14dip"
android:textStyle="bold"
android:text="@string/heading_pro_tip" />
<TextView
android:id="@+id/infoProTip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffcc00"
android:textSize="14dip" />
</LinearLayout>
</ScrollView>
</SlidingDrawer>
</RelativeLayout>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
SlidingDrawer 类的
onMeasure()
方法基本上将布局模式覆盖为fill_parent
,这就是layout_height="wrap_content"
不起作用的原因。为了解决这个问题,您可以使用重新实现的
onMeasure()
方法来扩展 SlidingDrawer,该方法支持layout_width
和layout_height
属性。然后,您可以在 XML 布局中使用此自定义类,方法是将
替换为
。请注意,由于抽屉将不再填充父布局,因此您必须将其包含在 LinearLayout 中,并将重力属性设置为抽屉应在的边缘。
下面是我为此目的创建的一个类和一个示例布局。
WrappingSlidingDrawer 类:
示例布局(假设 WrappingSlidingDrawer 位于包 com.package 中):
The
onMeasure()
method of the SlidingDrawer class basically overrides the layout modes tofill_parent
, this is whylayout_height="wrap_content"
is not working.To get around this, you can extend SlidingDrawer with a re-implemented
onMeasure()
method that honors thelayout_width
andlayout_height
attributes. You can then use this custom class in your XML layout by replacing<SlidingDrawer ...>
with<fully.qualified.package.ClassName ...>
.Note that since the drawer will no longer be filling the parent layout, you will have to enclose it in a LinearLayout with the gravity attribute set to the edge where the drawer should be.
Below are a class I have created for this purpose and an example layout.
WrappingSlidingDrawer class :
Example layout (assuming WrappingSlidingDrawer is in package com.package) :
只需在 xml 中的滑动抽屉中设置 pmargin
just set to pmargin in sliding drawer in your xml
seydhe的回答有一个小问题。
getAttributeIntValue 的第一个参数需要是完整的命名空间,而不仅仅是“android”。所以代码片段应该是:
我很难让它与水平滑动抽屉一起工作,直到我意识到它没有找到方向属性,因此将其视为垂直。
seydhe's answer has a small issue.
The first argument to the getAttributeIntValue needs to be the full namespace, not just "android". So the code snippet should be:
I was having trouble getting this to work with a horizontal sliding drawer until I realized that it was not finding the orientation attribute and was therefore treating it as vertical.
最好读取参数而不对字符串进行硬编码:
另一个问题是 onMeasure。
我使用了以下代码:
it is better to read the parameter without hardcoding the string:
Another issus is in the onMeasure.
I used the following code:
不幸的是你不能设置高度,而是相反。 topOffset 属性将决定滑动抽屉的高度,但它决定的是要剃除的内容,而不是它的高度。
unfortunately you can't set the height, but rather the opposite of that. the topOffset attribute will determine how tall to make the sliding drawer, but its what to shave off rather than how tall it will be.
它对我有用:
XML 布局:
It works for me:
XML Layout: