Android: नीचे तक स्क्रॉल करें बल


200

मैं नीचे की ओर सभी तरह से शुरू करने के लिए एक स्क्रॉल दृश्य पसंद करूंगा। कोई विधि?


1
मुझे लगता है कि इसका सिर्फ स्क्रोल्टो (), हाँ, मैंने सिर्फ स्क्रॉलव्यू के लिए देव डॉक्स की जाँच की। बहुत आसान।
नूह सीडमैन

जवाबों:


274

scroll.fullScroll(View.FOCUS_DOWN) काम भी करना चाहिए।

इस में डाल दो scroll.Post(Runnable run)

कोटलिन कोड

scrollView.post {
   scrollView.fullScroll(View.FOCUS_DOWN)
}

6
यह कुछ भी करने के लिए प्रतीत नहीं होता है, किसी भी सुझाव? मैंने इसे onCreate पर और बाद में एक बटन के onClick में आज़माया।
रिचर्ड जॉन

यह अभिविन्यास बदलने पर काम नहीं करता है। अन्यथा इसका काम।
प्रशांत

1
यह काम नहीं करता है अगर लेआउट आकार को कॉल करने से पहले सही बदल गया है। इसके बदले पोस्ट करना होगा।
MLProgrammer-CiM

2
यह और नीचे, तब तक काम नहीं करेगा जब तक कि आप पूरी तरह से फुलाए जाने के दृश्य को कुछ समय नहीं देते, बस एडेमर उत्तर को सरल बनाते हैं। ScrollView.postDelayed (नया Runnable () {@Override सार्वजनिक शून्य रन () {ScrollView.fullScroll (View.FOCUS_UP // या नीचे);}}, 1000);
EngineSense

Scroll.fullScroll (View.FOCUS_DOWN) फ़ोकस के परिवर्तन की ओर ले जाएगा। जब एक से अधिक ध्यान देने योग्य विचार होंगे, जैसे दो एडिट टेक्स्ट। नीचे दिए गए एक और समाधान की जांच करें।
शांति यात्रा

332

आपको स्क्रॉल के अंदर कोड चलाना चाहिए। इस तरह से पोस्ट करें:

scroll.post(new Runnable() {            
    @Override
    public void run() {
           scroll.fullScroll(View.FOCUS_DOWN);              
    }
});

4
ध्यान केंद्रित करने वाले मौजूदा तत्व को खोने के बिना कोई रास्ता है, जब मैं ऐसा करता हूं तो मैं अपने वर्तमान तत्व (
स्क्रॉलव्यू

2
यह केवल उन मामलों में आवश्यक है जहां लेआउट अभी तक मापा और लेआउट नहीं किया गया है (उदाहरण के लिए यदि आप इसे ऑनक्रिकेट में चलाते हैं)। बटन दबाने जैसे मामलों में .post () की जरूरत नहीं है।
पैट्रिक बूस

12
यदि आप scroll.scrollTo(0, scroll.getHeight());scroll.smoothScrollTo(0, scroll.getHeight());
स्क्रॉलव्यू

क्या यह कोड संभव मेमोरी लीक नहीं है? एक अनाम Runnable बनाया जाता है जो एक गतिविधि (स्क्रॉल) दृश्य का संदर्भ रखता है। यदि गतिविधि तबाह हो जाती है जबकि रन करने योग्य अपने कार्य को अंजाम दे रहा है, तो यह स्क्रॉलव्यू के संदर्भ में लीक हो जाएगा, नहीं?
जेनर

कोटलिन में:scrollView.post { scrollView.fullScroll(View.FOCUS_DOWN) }
अल्बर्ट विला कैल्वो

94

scroll.fullScroll(View.FOCUS_DOWN)फोकस के परिवर्तन के लिए नेतृत्व करेंगे। जब एक से अधिक ध्यान देने योग्य विचार होंगे, जैसे दो एडिट टेक्स्ट। इस सवाल का एक और तरीका है।

    View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1);
    int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom();
    int sy = scrollLayout.getScrollY();
    int sh = scrollLayout.getHeight();
    int delta = bottom - (sy + sh);

    scrollLayout.smoothScrollBy(0, delta);

यह अच्छा काम करता है।

कोटलिन एक्सटेंशन

fun ScrollView.scrollToBottom() {
    val lastChild = getChildAt(childCount - 1)
    val bottom = lastChild.bottom + paddingBottom
    val delta = bottom - (scrollY+ height)        
    smoothScrollBy(0, delta)
}

इसलिए खुशी है कि मुझे इस पर और समय बर्बाद नहीं करना पड़ा। बस मुझे क्या चाहिए
एलेक्जेंडर जी

6
यह अधिक upvotes होना चाहिए। यह अब तक का सबसे अच्छा जवाब है।
एरिक लैंग

1
यह यहां मौजूद सबसे अच्छा जवाब है।
शून्य सूचक

1
इस पृष्ठ पर बाकी सब कुछ करने की कोशिश की, यहां तक ​​कि नीचे का सामान भी। यह केवल एक ही चीज़ थी जो काम करती थी, और इससे मेरा EditText फ़ोकस खोने का कारण नहीं बनता। धन्यवाद।
जोएल

यदि आपको कीबोर्ड दिखाते समय नीचे स्क्रॉल करने की आवश्यकता है, तो इस लाइब्रेरी के साथ इस कोड को संयोजित करें । एक जादू की तरह काम करता है।
वंसुक

47

कभी-कभी स्क्रॉलव्यू.पोस्ट काम नहीं करता है

 scrollView.post(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

लेकिन अगर आप स्क्रॉलव्यू.पोस्टडेलिड का उपयोग करते हैं, तो यह निश्चित रूप से काम करेगा

 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);

पहचान के लिए धन्यवाद। पोस्टडेलिड बेहतर समाधान है।
प्रशांत

@ प्रशान्त :) :) :)
अजय

1
बस याद रखें कि जब आप गतिविधि समाप्त करते हैं, तो आपको अपने
Runnable को निपटाना होगा

38

मेरे लिए सबसे अच्छा काम क्या है

scroll_view.post(new Runnable() {
     @Override
     public void run() {
         // This method works but animates the scrolling 
         // which looks weird on first load
         // scroll_view.fullScroll(View.FOCUS_DOWN);

         // This method works even better because there are no animations.
         scroll_view.scrollTo(0, scroll_view.getBottom());
     }
});

मैंने यह कोशिश की, लेकिन यहाँ एल्गोरिथ्म गलत है। कृपया नीचे मेरे जवाब की जाँच करें।
शांति यात्रा

28

मैं पूरी तरह से काम करने के लिए वेतन वृद्धि।

    private void sendScroll(){
        final Handler handler = new Handler();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {Thread.sleep(100);} catch (InterruptedException e) {}
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        scrollView.fullScroll(View.FOCUS_DOWN);
                    }
                });
            }
        }).start();
    }

ध्यान दें

यह उत्तर एंड्रॉइड के पुराने संस्करणों के लिए एक समाधान है। आज postDelayedउस बग को और अधिक नहीं है और आपको इसका उपयोग करना चाहिए।


3
दो से ऊपर नहीं, लेकिन यह मेरे फोन में अच्छा काम करता है (एलजी जेलीबीन 4.1.2 ऑप्टिमस जी)।
यंगजई

9
क्यों नहीं स्क्रॉल का उपयोग करें। PostDelayed (चलाने योग्य, 100)?
मैट वोल्फ

1
@MattWolfe उस समय एंड्रॉइड के कुछ पुराने संस्करणों में काम नहीं करता है। लेकिन आज इस जवाब को बिल्कुल नहीं बताया गया है।
ademar111190

4
भगवान के प्यार के लिए, स्क्रॉलव्यू.पोस्टडेलएड (रननेबल, 100) का उपयोग करें! :)
एलेक्स लॉकवुड

1
मैंने एक नोट जोड़ा @AlexLockwood मुझे आशा है कि लोग postDelayed:) का उपयोग करें
ademar111190

4

मैंने कोशिश की कि सफल हो।

scrollView.postDelayed(new Runnable() {
    @Override
    public void run() {
        scrollView.smoothScrollTo(0, scrollView.getHeight());
    }
}, 1000);

3

जब दृश्य अभी तक लोड नहीं हुआ है, तो आप स्क्रॉल नहीं कर सकते। आप इसे ऊपर की तरह पोस्ट या स्लीप कॉल के साथ 'बाद में' कर सकते हैं, लेकिन यह बहुत सुरुचिपूर्ण नहीं है।

स्क्रॉल की योजना बनाना बेहतर है और इसे अगले onLayout () पर करें। यहाँ उदाहरण कोड:

https://stackoverflow.com/a/10209457/1310343


3

एक बात पर विचार करना है कि क्या सेट नहीं करना है। अपने बच्चे के नियंत्रण को सुनिश्चित करें, विशेष रूप से EditText नियंत्रण, के पास RequestFocus गुण सेट नहीं है। यह लेआउट पर अंतिम व्याख्या किए गए गुणों में से एक हो सकता है और यह अपने माता-पिता (लेआउट या स्क्रॉलव्यू) पर गुरुत्वाकर्षण सेटिंग्स को ओवरराइड करेगा।


3

नीचे स्क्रॉल करने के कुछ अन्य तरीके यहां दिए गए हैं

fun ScrollView.scrollToBottom() {
    // use this for scroll immediately
    scrollTo(0, this.getChildAt(0).height) 

    // or this for smooth scroll
    //smoothScrollBy(0, this.getChildAt(0).height)

    // or this for **very** smooth scroll
    //ObjectAnimator.ofInt(this, "scrollY", this.getChildAt(0).height).setDuration(2000).start()
}

का उपयोग करते हुए

यदि आप स्क्रोलव्यू पहले से ही बाहर रखा है

my_scroll_view.scrollToBottom()

यदि आपके स्क्रॉलव्यू को पूरा नहीं किया गया है (जैसे: आप गतिविधि onCreateविधि में नीचे स्क्रॉल करें ...)

my_scroll_view.post { 
   my_scroll_view.scrollToBottom()          
}

1

इस प्रश्न का उत्तर बिल्कुल नहीं है, लेकिन जैसे ही एक एडिट टेक्स्ट को फोकस मिला, मुझे नीचे स्क्रॉल करने की आवश्यकता थी। हालाँकि स्वीकृत उत्तर ईटी को तुरंत फोकस खो देगा (स्क्रॉलव्यू मुझे लगता है)।

मेरा समाधान निम्नलिखित था:

emailEt.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus){
            Toast.makeText(getActivity(), "got the focus", Toast.LENGTH_LONG).show();
            scrollView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(ScrollView.FOCUS_DOWN);
                }
            }, 200);
        }else {
            Toast.makeText(getActivity(), "lost the focus", Toast.LENGTH_LONG).show();
        }
    }
});

1

मैंने वास्तव में पाया कि फुलस्कूल को दो बार कॉल करने की कोशिश करता है:

myScrollView.fullScroll(View.FOCUS_DOWN);

myScrollView.post(new Runnable() {
    @Override
    public void run() {
        myScrollView.fullScroll(View.FOCUS_DOWN);
    }
});

यह पहली (असफल) स्क्रॉल करने के बाद पोस्ट () विधि के सक्रियण के साथ कुछ करना हो सकता है। मुझे लगता है कि यह व्यवहार myScrollView पर किसी भी पिछले विधि कॉल के बाद होता है, इसलिए आप किसी भी अन्य चीज़ के द्वारा पूर्ण fullScroll () विधि को बदलने का प्रयास कर सकते हैं जो आपके लिए प्रासंगिक हो सकता है।


0

Kotlin coroutines के साथ ऐसा करने का एक और अच्छा तरीका है। एक चल (पोस्ट / पोस्टडैलेड) के साथ एक हैंडलर के विरोध में एक कोरटाइन का उपयोग करने का लाभ यह है कि यह एक विलंबित कार्रवाई को निष्पादित करने के लिए एक महंगे धागे को फायर नहीं करता है।

launch(UI){
    delay(300)
    scrollView.fullScroll(View.FOCUS_DOWN)
}

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


0

उन मामलों में सिर्फ scroll.scrollTo (0, sc.getBottom ()) का उपयोग नहीं किया जा रहा है, इसे स्क्रॉल। Post का उपयोग करके उपयोग करें

उदाहरण:

scroll.post(new Runnable() {
  @Override
  public void run() {
  scroll.fullScroll(View.FOCUS_DOWN);
  } 
});

0

scroll.fullScroll(View.FOCUS_DOWN)हो सकता .post()है कि लिपटे हुए भी काम न करने का एक संभावित कारण यह है कि इस दृश्य को बाहर नहीं रखा गया है। इस मामले में View.doOnLayout () एक बेहतर विकल्प हो सकता है:

scroll.doOnLayout(){
    scroll.fullScroll(View.FOCUS_DOWN)
}

या, बहादुर आत्माओं के लिए कुछ और विस्तृत: https://chris.banes.dev/2019/12/03/suspest-p/

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