जवाबों:
scroll.fullScroll(View.FOCUS_DOWN)
काम भी करना चाहिए।
इस में डाल दो scroll.Post(Runnable run)
कोटलिन कोड
scrollView.post {
scrollView.fullScroll(View.FOCUS_DOWN)
}
आपको स्क्रॉल के अंदर कोड चलाना चाहिए। इस तरह से पोस्ट करें:
scroll.post(new Runnable() {
@Override
public void run() {
scroll.fullScroll(View.FOCUS_DOWN);
}
});
scroll.scrollTo(0, scroll.getHeight());
scroll.smoothScrollTo(0, scroll.getHeight());
scrollView.post { scrollView.fullScroll(View.FOCUS_DOWN) }
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)
}
कभी-कभी स्क्रॉलव्यू.पोस्ट काम नहीं करता है
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);
मेरे लिए सबसे अच्छा काम क्या है
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());
}
});
मैं पूरी तरह से काम करने के लिए वेतन वृद्धि।
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
उस बग को और अधिक नहीं है और आपको इसका उपयोग करना चाहिए।
postDelayed
:) का उपयोग करें
मैंने कोशिश की कि सफल हो।
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
scrollView.smoothScrollTo(0, scrollView.getHeight());
}
}, 1000);
जब दृश्य अभी तक लोड नहीं हुआ है, तो आप स्क्रॉल नहीं कर सकते। आप इसे ऊपर की तरह पोस्ट या स्लीप कॉल के साथ 'बाद में' कर सकते हैं, लेकिन यह बहुत सुरुचिपूर्ण नहीं है।
स्क्रॉल की योजना बनाना बेहतर है और इसे अगले onLayout () पर करें। यहाँ उदाहरण कोड:
एक बात पर विचार करना है कि क्या सेट नहीं करना है। अपने बच्चे के नियंत्रण को सुनिश्चित करें, विशेष रूप से EditText नियंत्रण, के पास RequestFocus गुण सेट नहीं है। यह लेआउट पर अंतिम व्याख्या किए गए गुणों में से एक हो सकता है और यह अपने माता-पिता (लेआउट या स्क्रॉलव्यू) पर गुरुत्वाकर्षण सेटिंग्स को ओवरराइड करेगा।
नीचे स्क्रॉल करने के कुछ अन्य तरीके यहां दिए गए हैं
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()
}
इस प्रश्न का उत्तर बिल्कुल नहीं है, लेकिन जैसे ही एक एडिट टेक्स्ट को फोकस मिला, मुझे नीचे स्क्रॉल करने की आवश्यकता थी। हालाँकि स्वीकृत उत्तर ईटी को तुरंत फोकस खो देगा (स्क्रॉलव्यू मुझे लगता है)।
मेरा समाधान निम्नलिखित था:
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();
}
}
});
मैंने वास्तव में पाया कि फुलस्कूल को दो बार कॉल करने की कोशिश करता है:
myScrollView.fullScroll(View.FOCUS_DOWN);
myScrollView.post(new Runnable() {
@Override
public void run() {
myScrollView.fullScroll(View.FOCUS_DOWN);
}
});
यह पहली (असफल) स्क्रॉल करने के बाद पोस्ट () विधि के सक्रियण के साथ कुछ करना हो सकता है। मुझे लगता है कि यह व्यवहार myScrollView पर किसी भी पिछले विधि कॉल के बाद होता है, इसलिए आप किसी भी अन्य चीज़ के द्वारा पूर्ण fullScroll () विधि को बदलने का प्रयास कर सकते हैं जो आपके लिए प्रासंगिक हो सकता है।
Kotlin coroutines के साथ ऐसा करने का एक और अच्छा तरीका है। एक चल (पोस्ट / पोस्टडैलेड) के साथ एक हैंडलर के विरोध में एक कोरटाइन का उपयोग करने का लाभ यह है कि यह एक विलंबित कार्रवाई को निष्पादित करने के लिए एक महंगे धागे को फायर नहीं करता है।
launch(UI){
delay(300)
scrollView.fullScroll(View.FOCUS_DOWN)
}
यूआई के रूप में कोरटाइन के हैंडलर कॉन्टेक्स्ट को निर्दिष्ट करना महत्वपूर्ण है अन्यथा यूआई थ्रेड से विलंबित कार्रवाई को नहीं बुलाया जा सकता है।
scroll.fullScroll(View.FOCUS_DOWN)
हो सकता .post()
है कि लिपटे हुए भी काम न करने का एक संभावित कारण यह है कि इस दृश्य को बाहर नहीं रखा गया है। इस मामले में View.doOnLayout () एक बेहतर विकल्प हो सकता है:
scroll.doOnLayout(){
scroll.fullScroll(View.FOCUS_DOWN)
}
या, बहादुर आत्माओं के लिए कुछ और विस्तृत: https://chris.banes.dev/2019/12/03/suspest-p/