我想创建一个动态扩展的布局,可能会反映到用户的输入。首先,我创建了一个允许双向滚动的活动布局(这不是我的发明,我使用a comment to another question中解释的想法进行了一些改进):
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clipChildren="false"
android:clipToPadding="false"
tools:ignore="UselessParent" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clipChildren="false"
android:clipToPadding="false" >
<RelativeLayout
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clipChildren="false"
android:clipToPadding="false" >
</RelativeLayout>
</FrameLayout>
</FrameLayout>
然后,我在下面创建了一个简单的UI布局,一个文本视图和一个垂直线性布局。这是我的message_with_replies.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/header"
android:layout_width="300dp"
android:layout_height="wrap_content" >
<!-- some text views and buttons here,
I've removed them to keep things simple,
see the screenshot below -->
</LinearLayout>
<LinearLayout
android:id="@+id/replies"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
请注意回复布局中的10dp边距以及与剪裁相关的属性。
因此,我现在可以使用message_with_replies布局对项目进行充气,并将其添加到活动的内容布局中,然后为另一项目充气并将其添加到回复带有第一个项目的线性布局,依此类推,从而创建一个树状的层次结构。并且整个树都在水平和垂直方向上显示和滚动。
然而,看起来布局仍然以某种方式限制屏幕大小。我有两个问题:
1)右边缘以外的项目看起来很好但不接收用户输入。 2)超出底边的布局搞砸了。
这是截图。从左到右:1)一切看起来都很好,2)哎呀,按钮在边缘,3)哎呀,底部搞砸了。
看起来我错过了一些简单而隐藏的东西。如何使布局超出屏幕边缘?
答案 0 :(得分:10)
解决方案非常简单。
在活动布局中,RelativeLayout节点(具有 content ID的节点)应使用覆盖onMeasure方法的自定义布局类。
所以这是活动布局的修复:
<com.sample.MyRelativeLayout
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clipChildren="false"
android:clipToPadding="false" >
</com.sample.MyRelativeLayout>
这是类实现:
public class MyRelativeLayout extends RelativeLayout {
public MyRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(0, 0);
}
}
请注意,我不必计算任何东西,传递(0,0)就可以了。
坦率地说,我还不了解这个解决方案的所有优点和缺点,但它运作正常。到目前为止,我注意到的唯一问题是我扩展的项目越多,UI响应越慢。
我会感激任何意见或建议。