स्क्रॉलव्यू के लिए कोई गुरुत्वाकर्षण नहीं। स्क्रॉलव्यू के अंदर सामग्री को केंद्र के रूप में कैसे बनाया जाए


104

मुझे स्क्रॉल दृश्य के अंदर की सामग्री केंद्र के रूप में चाहिए।

<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 स्क्रॉलवे के लिए कोई विशेषता नहीं है ।

कोई सोल: -

जवाबों:


175

मैं एक ही मुद्दा था और अंत में यह समझ से बाहर है। यह एक ऊर्ध्वाधर के लिए है ScrollView

अपने ScrollViewअंदर रखें RelativeLayoutऔर इसे केंद्र में रखें 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>

29
यह स्वीकार किए गए उत्तर की तुलना में मेरे लिए बेहतर काम करता है। धन्यवाद!
पैट्रिक बूस

आदर्श रूप से एंड्रॉइड को इस मुद्दे पर ध्यान देना चाहिए जब लेआउट का एक पदानुक्रम होता है। इसके अलावा दोनों स्क्रॉल (क्षैतिज / ऊर्ध्वाधर) विकल्प एक स्क्रॉलव्यू में प्रदान करें। BTW धन्यवाद @hadi
mayank_droid

2
यह थोड़ा हैक है, इसलिए जब यह ठीक काम करता है तो यह गलत लगता है।
डेरियस १

3
अरे इसका काम, लेकिन स्क्रॉल नहीं है जब कीबोर्ड दिखाई देता है, मैंने प्रकट में जोड़ने की कोशिश की android:windowSoftInputMode="stateHidden|adjustResize"लेकिन, स्क्रॉल न करें, कृपया मेरी मदद करें
हेलियो सोरर्स जूनियर

3
RelativeLayoutमूल दृश्य के रूप में भारी उपयोग करने की आवश्यकता नहीं है । यह हो सकता है FrameLayoutऔर के android:layout_gravity="center_vertical"लिएScrollView
GrafOrlov

148

इस बारे में कैसा है?

<?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>

2
हाँ! उस के बारे में कैसा है! यह मेरे लिए काल्पनिक रूप से काम करता है, इसलिए बहुत बहुत धन्यवाद, दयालु महोदय।
रिले

बहुत बढ़िया! इसने मुझे भी बचाया! धन्यवाद :)
marienke

101
इसके साथ एक समस्या है। यदि आप स्क्रॉलव्यू में सामग्री स्क्रॉलशॉट से बड़ी है, तो यह अभी भी इसे केंद्र करेगा और शीर्ष पर सामग्री को काट देगा (हालांकि अभी तक निश्चित नहीं है)। मतलब आप वहां स्क्रॉल नहीं कर सकते।
पैट्रिक बूस

7
पैट्रिकबॉस सही है; यह काम नहीं लगता है। नीचे हैदी के उत्तर का उपयोग करें, एक रिलेवेटलाइवआउट में स्क्रॉलव्यू को लंबवत रूप से केंद्रित करें।
मेसन ली

हां, इस तरह से बग, स्क्रॉलव्यू से बड़ा कंटेंट है, कंटेंट ऊपर की ओर स्क्रॉल नहीं करेगा, उसका टॉप निगेटिव नंबर है, अजीब है :(
क्रोस

98

मुझे लगता है कि एक और अधिक सुरुचिपूर्ण समाधान का उपयोग किया जाएगा ScrollViewकी android:fillViewportसंपत्ति। A ScrollViewइसमें थोड़ा भिन्न है कि यह कैसा है, यह सामग्री दृश्य है (केवल एक ही हो सकता है), भले ही आप इसे सेट करें match_parent( fill_parent) ScrollViewइसे सामग्री दृश्य में उतना स्थान न दें, इसके बजाय डिफ़ॉल्ट व्यवहार ScrollViewरैप करने के लिए है। उस दृश्य के लिए आपके द्वारा निर्दिष्ट किए बिना सामग्री। व्यूपोर्ट ( http://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport ) को भरने के लिए इसकी सामग्री को फैलाने android:fillViewportके ScrollViewलिए क्या कहा जाता है । तो इस मामले में, आपका व्यूपोर्ट से मिलान करने के लिए बढ़ाया जाएगा और अगर ऊंचाई व्यूपोर्ट के पीछे जाती है, तो यह स्क्रॉल करने योग्य होगा जो कि वास्तव में आप चाहते हैं! 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>

बस याद रखें कि कारण इसे यहाँ अब केंद्रित किया जा रहा है की वजह से है android:gravityपर LinearLayoutबाद ScrollViewविस्तृत होंगी LinearLayoutतो मन में क्या आप लेआउट में जोड़ने के आधार पर है कि रखने के लिए।

एक और अच्छा पढ़ने के ScrollViewबारे में हालांकि केंद्र के बारे में नहीं है, लेकिन इसके बारे fillViewportमें http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/ है


11
यह सबसे सही कार्यान्वयन की तरह दिखता है, किसी भी अतिरिक्त विचार की आवश्यकता नहीं है।
DariusL

1
अच्छा समाधान, मेरे लिए सबसे साफ लगता है। इसके लिए धन्यवाद
बेंजामिन शरबाउ

2
स्वीकृत उत्तर से बेहतर काम करता है, आपने मुझे बहुत समय बचाया है! वास्तव में अच्छी तरह से किया ब्रायन Ethier!
मटिया रग्गिएरो

यह सही समाधान है, इसमें वर्णित सभी कारणों के लिए .. यदि आप ऊपर दिए गए समाधान का प्रयास करते हैं, और आपका स्क्रॉल दृश्य आपकी स्क्रीन की तुलना में व्यापक है, तो आपके पास वास्तव में आपके स्क्रॉलव्यू का हिस्सा उपलब्ध नहीं होगा और इसे स्क्रॉल करने में असमर्थ होगा। यह उचित समाधान के रूप में स्वीकार किया जाना चाहिए
Speckpgh

1
ठेठ Stackoverflow .. सही समाधान अक्सर बीच में कहीं है।
तेवोल्ड

14

स्क्रॉलव्यू में इस विशेषता का उपयोग करें

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>

ऊपर के उदाहरण की तरह स्क्रॉलव्यू में सिंगल चाइल्ड का उपयोग करना सुनिश्चित करें जो कि रिलेटिवलेआउट है।


@JoshuaKing हो सकता है क्योंकि यह 7 साल पुराना सवाल है और मैंने यह जवाब हाल ही में 9 महीने पहले पोस्ट किया था।
अभिषेक गर्ग

हा! ओह .. सच। वास्तव में, यह पूरी तरह से काम किया! तो धन्यवाद!
यहोशू राजा

1
यह निश्चित रूप से स्वीकृत उत्तर होना चाहिए! यह पूरी तरह से काम करता है और अगर सामग्री कंटेनर के आकार से कम है, तो एक स्क्रॉल दृश्य केंद्र करता है। स्क्रॉलव्यू और हॉरिज़ॉन्टलक्रॉसव्यू दोनों के लिए काम करता है। आपको बहुत - बहुत धन्यवाद! Apr
रे ली

यह स्क्रॉल दृश्य के अंदर आपकी सामग्री को खींचने का अनपेक्षित प्रभाव हो सकता है
martinseal1987

@ martinseal1987 मुझे लगता है कि प्रभाव आपके बच्चे के घटक पर निर्भर करेगा, कि आप अपने लेआउट डिज़ाइन को कैसे बनाते हैं, हालांकि यदि यह आपके लिए काम नहीं करता है, तो आप अपने डिजाइन और काम की जरूरतों के अनुसार अपने खुद के कस्टम स्क्रॉल व्यू घटक बना सकते हैं। और कृपया आप मेरे साथ वांछित परिणाम स्क्रीनशॉट भी साझा करें, ताकि मैं देख सकूं और आपके अधिक बेहतर और काम करने वाले समाधान प्रदान कर सकूं। मदद के लिए तैयार। खुश होती है।
अभिषेक गर्ग

9

@Patrick_Boss के लिए - मेरे आवेदन में कटने से सामग्री को रोकने के लिए रेखीय लाउट के लिए गुरुत्व और लेआउट_ग्रेविटी को केंद्र_हृदय में बदलना था।

इसने मेरे लिए काम किया ... लेकिन यकीन नहीं होता कि यह आपके लिए काम करेगा।

@ भूत के उत्तर का संशोधन -

<?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>

1
यह कटिंग को टॉप ऑफ प्रॉब्लम को हल करता है। लेकिन इस समाधान के साथ अभी भी एक समस्या है। स्क्रॉल दृश्य सामग्री लंबवत केंद्रित नहीं थी। लेकिन यह स्क्रॉलव्यू के निम्नलिखित मान सेट करके तय किया जा सकता है: android: layout_height = "wra_content" android: layout_gravity = "center_vertical"
पैट्रिक बूस

मैंने पाया है कि इसके लिए अन्य लेआउट के भीतर काम करने के लिए, शीर्ष स्क्रॉल दृश्य को फ्रेम-आउट के भीतर एम्बेड किया जाना चाहिए।
थियो

1

एक बात पर विचार करना है कि क्या सेट नहीं करना है । अपने बच्चे पर नियंत्रण रखें, विशेष रूप से EditTextनियंत्रण, संपत्ति सेट नहीं है RequestFocus

यह लेआउट पर अंतिम व्याख्या किए गए गुणों में से एक हो सकता है और यह अपने माता-पिता ( layoutया ScrollView) पर गुरुत्वाकर्षण सेटिंग्स को ओवरराइड करेगा ।


0

ConstraintLayout के अंदर स्क्रॉल दृश्य का उपयोग करना। यह मेरे लिए काम किया है

<androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white">

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" />
            </ScrollView>
        </androidx.constraintlayout.widget.ConstraintLayout>

स्क्रॉल दृश्य की ऊँचाई रैप_ कॉन्टेंट होनी चाहिए

<ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.