web-dev-qa-db-ja.com

スクロールビュー内のレイアウトの下部にビューを追加する

したがって、私のレイアウトは基本的に次のようになります。

<ScrollView>
    <RelativeLayout>
        <BunchOfViews/>
        <ImageView Android:layout_alignParentBottom="true"/>
    </RelativeLayout>
</ScrollView>

ScrollViewがあるので、画面の高さに関係なく、すべてのレイアウトが常に表示されます。問題は、非常に高い画面でも、ImageViewを一番下にしたいということです。ただし、ScrollViewの子には底が定義されていないようです。 Viewはレイアウトの上部に配置されます。この問題をきちんと解決するにはどうすればよいですか?

63
pgsandstrom

私は同じ問題に遭遇しました。非常に楽しいソリューションを見つけることはできませんでしたが、ここでそれを実現しました。他の誰かがもっと良い方法を持っているかもしれません。何もしないレイアウトを追加するのは嫌です。

私のハックは、scrollviewの下部にfill_parentを持つダミーのlinearlayoutoutを追加して、すべての部屋を占有させ、scrollviewを強制的に画面いっぱいにすることでした。次に、そのlinearlayoutに必要なコンポーネントを追加します。

これを行うレイアウトの1つを次に示します。

<ScrollView
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_weight="1"
    Android:fillViewport="true" >

    <RelativeLayout
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:layout_marginTop="15px" >

        <!-- bunch of components here -->

        <LinearLayout
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:layout_below="@+id/spinner"
            Android:layout_marginTop="5px"
            Android:gravity="center_horizontal|bottom"
            Android:paddingTop="2px" >

            <Button
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:paddingLeft="20px"
                Android:paddingRight="20px"
                Android:text="Delete" />
        </LinearLayout>
    </RelativeLayout>
</ScrollView>
140
dweebo

私は同じ問題を抱えていて、このページを見つけました:

http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/

基本的に、ScrollViewのAndroid:fillViewportをtrueに設定すると、子ビューがScrollView自体と同じ高さまで拡大し、スペースがいっぱいになります。次に、子コントロールのlayout_height に設定 fill_parentおよびlayout_weightから1、そのコントロールを「スプリング」させて空のスペースを埋めます。

ScrollViewのコンテンツが既にScrollViewを満たすのに十分な高さである場合、Android:fillViewportは効果がないため、設定は必要なときにのみ有効になります。

最終的なXMLは次のようになります。

<ScrollView
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:fillViewport="true">
    <LinearLayout
        Android:orientation="vertical"
        Android:layout_height="wrap_content">
        <LinearLayout
            Android:layout_height="fill_parent"
            Android:layout_weight="1">
            <!-- this expands to fill the empty space if needed -->
        </LinearLayout>

        <!-- this sits at the bottom of the ScrollView,
        getting pushed out of view if the ScrollView's
        content is tall enough -->
        <ImageView
            Android:layout_height="wrap_content"
            Android:src="@drawable/footer_image">
        </ImageView>
    </LinearLayout>
</ScrollView>
69
Joel Malone

linearlayoutは必要ないと思われますが、重要なのはfillViewPortだけです。あなたはただ使うことができます

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignBottomParent="true">

これで、相対レイアウトを少なくとも画面のサイズに指定したことになります。

20
Laurent

android:fillViewport = "true"の完全にその仕事

13
Shohel Rana

ジョエル・マローンの答え スクロールビュー内のレイアウトの下部にビューを追加する はそのトリックを行います。私のソリューションはほぼ同じですが、Spaceウィジェットを使用して、親レイアウト内の残りの高さを埋める作業を行います。このような:

<ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent
    Android:fillViewport="true"
    >
    <LinearLayout
        Android:orientation="vertical"
        Android:layout_height="wrap_content"
        >
        <Android.support.v4.widget.Space
            Android:layout_height="match_parent"
            Android:layout_weight="1"
            />
    <ImageView
        Android:layout_height="wrap_content"
        Android:src="@drawable/footer_image"
        />
    </LinearLayout>
</ScrollView>

注意:

  • fill_parentその他の回答では、長い間廃止されていると記載されています。
  • 空のLinearLayoutと比較して、親レイアウトの残りを埋めるには、Spaceの方がはるかに適切だと思います(その仕事をするように設計されています)。
  • 最後に、ScrollViewの先頭にある重要な属性を忘れないでください:Android:fillViewport="true"。彼らは一緒にこのトリックを作ります。
8
Anthonyeef

一番下にしたいビューで、Android:gravity = "bottom"を使用します

1
hitch45

From: http://code.google.com/p/k9mail/source/browse/k9mail/trunk/res/layout/account_setup_basics.xml?r=1314

これはあなたを助けるはずです:

<RelativeLayout
        Android:layout_marginTop="-45dip" 
        Android:padding="0dip"
        Android:layout_alignParentBottom="true"
        Android:gravity="bottom|right" 
        Android:background="@Android:drawable/bottom_bar"
        Android:layout_height="fill_parent"
        Android:layout_width="fill_parent">
        <Button
            Android:id="@+id/manual_setup"
            Android:text="@string/account_setup_basics_manual_setup_action"
            Android:minWidth="@dimen/button_minWidth"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:layout_marginBottom="-4dip" 
            Android:layout_alignParentLeft="true"
            Android:layout_centerVertical="false" 
            />
        <Button
            Android:id="@+id/next"
            Android:text="@string/next_action"
            Android:minWidth="@dimen/button_minWidth"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:drawableRight="@drawable/button_indicator_next"
            Android:layout_marginBottom="-4dip" 
            Android:layout_alignParentRight="true"
            Android:layout_centerVertical="false" 
            />
    </RelativeLayout>
0
Pentium10
ScrollView view = new ScrollView( this );
ScrollView.LayoutParams lps = new FrameLayout.LayoutParams( FILL_PARENT, FILL_PARENT, Gravity.CENTER );
LinearLayout layout = new LinearLayout( this );
// what ever you want in the Layout 
view.addView( layout, lps );
0
Shibly