web-dev-qa-db-ja.com

scrollviewには重力はありません。中心としてスクロールビュー内のコンテンツを作成する方法

ScrollView内のコンテンツを中心にしたい。

<ScrollView
    Android:id="@+id/scroller"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:paddingTop="12dp"
    Android:paddingBottom="20dp"
    Android:scrollbarStyle="outsideOverlay"
    Android:layout_gravity="center" >

    <Button 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="check" 
        Android:gravity="center_vertical|center_horizontal"/>

</ScrollView>

注:はありませんAndroid:gravity scrollvewの属性。

任意のソル:-

98
Padma Kumar

私は同じ問題を抱えていて、最終的にそれを理解しました。これは垂直ScrollView用です。

ScrollViewRelativeLayoutの内側に置き、RelativeLayoutの中央に配置します。これが機能するためには、ScrollView

Android:layout_height="wrap_content"

これは最終的なコードがどのように見えるべきであるかです:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">

    <ScrollView
        Android:id="@+id/scrollView1"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content" 
        Android:layout_centerVertical="true" >

        <LinearLayout
            Android:id="@+id/linearLayout1"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:orientation="vertical">

            <Button
                Android:id="@+id/button1"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:text="b1"/>
            <Button
                Android:id="@+id/button2"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:text="b2"/>
            <Button
                Android:id="@+id/button3"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:text="b3"/>
        </LinearLayout>

    </ScrollView>

</RelativeLayout>
163
hadi

これはどう?

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/scrollView1"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:paddingTop="12dp"
    Android:paddingBottom="20dp"
    Android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        Android:id="@+id/linearLayout1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical" 
        Android:layout_gravity="center"
        Android:gravity="center">

        <Button
            Android:id="@+id/button1"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="check" 
            Android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>
142
Ghost

よりエレガントなソリューションは、ScrollViewAndroid:fillViewportプロパティを使用することだと思います。 ScrollViewは、match_parentfill_parent)をScrollViewに設定した場合でも、コンテンツビューの処理方法が少し異なります(1つしか持てません)。 tはコンテンツビューに十分な間隔を空け、代わりに、デフォルトの動作では、ビューに指定した内容に関係なく、ScrollViewがコンテンツをラップします。 Android:fillViewportが行うことは、ScrollViewにコンテンツをストレッチしてビューポートを満たすように指示することです( http://developer.Android.com/reference/Android/widget/ScrollView.html#attr_Android:fillViewport )。したがって、この場合、LinearLayoutはビューポートに一致するように引き伸ばされ、高さがビューポートの背後にある場合は、まさに望みどおりのスクロールが可能になります。

コンテンツがScrollViewを超える場合、受け入れられた回答は正しく機能しません。これは、コンテンツビューを最初に中央に配置してビューの一部を切り取り、ScrollViewが別のレイアウトの中央に配置されるためです。動作しますが、正しくないと感じますが、リントエラーも発生します(役に立たない親またはそれらの行に沿った何か)。

次のようなものを試してください:

<ScrollView
    Android:id="@+id/scroller"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:paddingTop="12dp"
    Android:paddingBottom="20dp"
    Android:scrollbarStyle="outsideOverlay"
    Android:fillViewport="true">

    <LinearLayout
        Android:id="@+id/content"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        Android:gravity="center">

        <Button
            Android:id="@+id/button"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="check" />

    </LinearLayout>

</ScrollView>

ここで中央に配置される理由は、LinearLayoutScrollViewを引き伸ばすので、LinearLayoutAndroid:gravityが原因であることに注意してください。レイアウトに追加します。

ScrollViewのもう1つの良い読み物は、センタリングについてではなく、fillViewportについてです http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/

89
Brian Ethier

@Patrick_Bossの場合-私のアプリケーションでコンテンツが切り取られないようにしたのは、LinearLayoutの重力とlayout_gravityをcenter_horizo​​ntalに変更することでした。

それは私のために働いた...しかしそれがあなたのために働くかどうか確かではない。

@Ghostの答えの修正-

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/scrollView1"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:paddingTop="12dp"
    Android:paddingBottom="20dp"
    Android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        Android:id="@+id/linearLayout1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical" 
        Android:layout_gravity="center_horizontal"
        Android:gravity="center_horizontal">

        <Button
            Android:id="@+id/button1"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="check" 
            Android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>
9
ProgDevCode

ScrollViewでこの属性を使用

Android:fillViewport="true"

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:scrollbarStyle="outsideOverlay"
Android:fillViewport="true"
>
   <RelativeLayout
              Android:layout_width="match_parent"
              Android:layout_height="wrap_content">

         <!--Your Code goes here-->

   </RelativeLayout>

</ScrollView>

上の例のRelativelayoutと同じように、ScrollViewで必ずSingle Childを使用してください。

9
Abhishek Garg

考慮すべき点の1つは、設定しないものです。特定の子コントロール、特にEditTextコントロール、しないRequestFocusプロパティを設定してください。

これは、レイアウト上で最後に解釈されたプロパティの1つであり、その親の重力設定をオーバーライドしますlayoutまたはScrollView)。

1
Epsilon3