如何制作比屏幕大的动态布局?

时间:2012-08-26 14:39:14

标签: android android-layout

我想创建一个动态扩展的布局,可能会反映到用户的输入。首先,我创建了一个允许双向滚动的活动布局(这不是我的发明,我使用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)哎呀,底部搞砸了。

From left to right: 1) Everything looks fine, 2) Oops the button is on the edge, 3) Oops the bottom is messed.

看起来我错过了一些简单而隐藏的东西。如何使布局超出屏幕边缘?

1 个答案:

答案 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响应越慢。

我会感激任何意见或建议。