Bir ScrollView en alttan başlamak istiyorum. Herhangi bir yöntem var mı?
Bir ScrollView en alttan başlamak istiyorum. Herhangi bir yöntem var mı?
Yanıtlar:
scroll.fullScroll(View.FOCUS_DOWN)
ayrıca çalışması gerekir.
Bunu bir scroll.Post(Runnable run)
Kotlin Kodu
scrollView.post {
scrollView.fullScroll(View.FOCUS_DOWN)
}
scroll.post içindeki kodu şu şekilde çalıştırmalısınız:
scroll.post(new Runnable() {
@Override
public void run() {
scroll.fullScroll(View.FOCUS_DOWN);
}
});
scroll.scrollTo(0, scroll.getHeight());
, aşağıya atlamak veya scroll.smoothScrollTo(0, scroll.getHeight());
daha yumuşak bir kaydırma için kullanabilirsiniz
scrollView.post { scrollView.fullScroll(View.FOCUS_DOWN) }
scroll.fullScroll(View.FOCUS_DOWN)
odak değişikliğine yol açacaktır. Birden fazla odaklanabilir görünüm olduğunda, örneğin iki EditText olduğunda bu garip bir davranış getirecektir. Bu sorunun başka bir yolu daha var.
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);
Bu iyi çalışıyor.
Kotlin Uzantısı
fun ScrollView.scrollToBottom() {
val lastChild = getChildAt(childCount - 1)
val bottom = lastChild.bottom + paddingBottom
val delta = bottom - (scrollY+ height)
smoothScrollBy(0, delta)
}
Bazen scrollView.post çalışmıyor
scrollView.post(new Runnable() {
@Override
public void run() {
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
});
AMA scrollView.postDelayed kullanıyorsanız kesinlikle işe yarar
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
},1000);
Benim için en iyi olan şey
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());
}
});
Mükemmel çalışmayı artırıyorum.
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();
}
Not
Bu cevap, android'in gerçekten eski sürümleri için bir çözümdür. Bugün postDelayed
artık bu hata var ve kullanmalısınız.
postDelayed
:) kullanın
bunu başarılı bir şekilde denedim.
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
scrollView.smoothScrollTo(0, scrollView.getHeight());
}
}, 1000);
Görünüm henüz yüklenmediğinde kaydırma yapamazsınız. Yukarıdaki gibi bir posta veya uyku çağrısı ile 'daha sonra' yapabilirsiniz, ancak bu çok zarif değil.
Kaydı planlamak ve sonraki onLayout () öğesinde yapmak daha iyidir. Örnek kod burada:
Dikkate alınması gereken bir şey, ne ayarlanmayacağıdır. Alt denetimlerinizin, özellikle EditText denetimlerinin, RequestFocus özelliğinin ayarlanmadığından emin olun. Bu, mizanpajdaki en son yorumlanan özelliklerden biri olabilir ve ebeveynlerindeki yerçekimi ayarlarını geçersiz kılar (mizanpaj veya ScrollView).
Aşağıya kaydırmanın diğer yolları
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()
}
kullanma
Önceden düzenlenmiş olan kaydırma görüntünüz varsa
my_scroll_view.scrollToBottom()
Kaydırma görünümünüz tamamlanmadıysa (ör. Etkinlik onCreate
yönteminde en alta kaydırırsınız ...)
my_scroll_view.post {
my_scroll_view.scrollToBottom()
}
Tam olarak sorunun cevabı değil, ama bir EditText odaklanır ulaşmaz aşağı kaydırmak gerekiyordu. Ancak kabul edilen cevap ET'nin de odağı hemen kaybetmesini sağlayacaktır (sanırım ScrollView'a göre).
Geçici çözümüm şuydu:
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();
}
}
});
Aslında fullScroll'u iki kez çağırmanın hile yaptığını gördüm:
myScrollView.fullScroll(View.FOCUS_DOWN);
myScrollView.post(new Runnable() {
@Override
public void run() {
myScrollView.fullScroll(View.FOCUS_DOWN);
}
});
İlk (başarısız) kaydırma yapıldıktan hemen sonra post () yönteminin etkinleştirilmesiyle ilgili olabilir. Bu davranış, myScrollView önceki bir yöntem çağrısından sonra oluşur, bu yüzden ilk fullScroll () yöntemini sizinle ilgili başka bir şeyle değiştirmeyi deneyebilirsiniz.
Kotlin coroutines ile bunu yapmanın başka bir harika yolu var. Runnable (post / postDelayed) ile bir Handler'a karşı koroutin kullanmanın avantajı, gecikmeli bir eylem gerçekleştirmek için pahalı bir iş parçacığını ateşlememesidir.
launch(UI){
delay(300)
scrollView.fullScroll(View.FOCUS_DOWN)
}
Coroutine HandlerContext'i UI olarak belirtmek önemlidir, aksi takdirde gecikmeli eylem UI iş parçacığından çağrılamayabilir.
Neden scroll.fullScroll(View.FOCUS_DOWN)
sarılmasa bile işe yaramayabileceğinin olası bir nedeni .post()
, görünümün ortaya konmamış olmasıdır. Bu durumda View.doOnLayout () daha iyi bir seçenek olabilir:
scroll.doOnLayout(){
scroll.fullScroll(View.FOCUS_DOWN)
}
Ya da, cesur ruhlar için daha ayrıntılı bir şey: https://chris.banes.dev/2019/12/03/suspending-views/
Bu anında çalışır . Gecikmesiz.
// wait for the scroll view to be laid out
scrollView.post(new Runnable() {
public void run() {
// then wait for the child of the scroll view (normally a LinearLayout) to be laid out
scrollView.getChildAt(0).post(new Runnable() {
public void run() {
// finally scroll without animation
scrollView.scrollTo(0, scrollView.getBottom());
}
}
}
}