1

ユーザーの入力を反映して大きくなる可能性のある動的に拡張するレイアウトを作成したいと思います。まず、両方向にスクロールできるアクティビティレイアウトを作成しました(これは私の発明ではありません。コメントで説明されているアイデアを使用して、いくつかの改善を加えました)。

<?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レイアウトを使用してアイテムを膨らませ、アクティビティのコンテンツレイアウトに追加してから、別のアイテムを膨らませて、最初のアイテムを含むreplies線形レイアウトに追加することができます。これにより、ツリーのような階層が作成されます。 。また、ツリー全体が表示され、水平方向と垂直方向の両方にスクロールされます。

ただし、画面サイズによってレイアウトが制限されているようです。私には2つの問題があります:

1)右端を超えるアイテムは見栄えがしますが、ユーザー入力を受け取りません。2)下端を超えたレイアウトがめちゃくちゃです。

これがスクリーンショットです。左から右へ:1)すべてが正常に見えます、2)おっと、ボタンは端にあります、3)おっと、底はめちゃくちゃです。

左から右へ:1)すべてが正常に見えます。2)ボタンが端にあります。3)おっと底がめちゃくちゃです。

シンプルだけど隠されたものを見逃したようです。画面の端を超えてレイアウトを機能させるにはどうすればよいですか?

4

1 に答える 1

10

解決策は驚くほど簡単です。

アクティビティ レイアウトでは、RelativeLayout ノード (コンテンツ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 の応答が遅くなることです。

コメントや提案をいただければ幸いです。

于 2012-09-03T14:52:50.733 に答える