আমি নীচে সমস্ত পথ শুরু করতে একটি স্ক্রোলভিউ চাই। কোন পদ্ধতি?
আমি নীচে সমস্ত পথ শুরু করতে একটি স্ক্রোলভিউ চাই। কোন পদ্ধতি?
উত্তর:
scroll.fullScroll(View.FOCUS_DOWN)
এছাড়াও কাজ করা উচিত।
এটি একটি রাখুন scroll.Post(Runnable run)
কোটলিন কোড
scrollView.post {
scrollView.fullScroll(View.FOCUS_DOWN)
}
আপনার এই কোডটি স্ক্রোলের ভিতরে চালানো উচিত p পোস্টের মতো:
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();
}
বিঃদ্রঃ
এই উত্তরটি অ্যান্ড্রয়েডের সত্যিকারের পুরানো সংস্করণের জন্য কার্যকর ar আজকের আর postDelayed
কোনও ত্রুটি নেই এবং এটি ব্যবহার করা উচিত।
postDelayed
:)
আমি যে সফল চেষ্টা।
scrollView.postDelayed(new Runnable() {
@Override
public void run() {
scrollView.smoothScrollTo(0, scrollView.getHeight());
}
}, 1000);
যখন দৃশ্যটি এখনও লোড করা হয়নি, আপনি স্ক্রোল করতে পারবেন না। উপরের মতো পোস্ট বা স্লিপ কল দিয়ে আপনি এটি 'পরে' করতে পারেন তবে এটি খুব মার্জিত নয়।
স্ক্রোলটি পরিকল্পনা করা এবং পরবর্তী লেআউট () এ এটি করা ভাল। উদাহরণ কোড এখানে:
একটি বিষয় বিবেচনা করতে হবে তা সেট না করা। আপনার শিশু নিয়ন্ত্রণ নির্দিষ্ট করে নিন, বিশেষত এডিটেক্সট নিয়ন্ত্রণগুলি, রিকোয়েস্টফোকস সম্পত্তি সেট নেই। এটি লেআউটের সর্বশেষ বর্ণিত বৈশিষ্ট্যগুলির মধ্যে একটি হতে পারে এবং এটি তার পিতামাতার (লেআউট বা স্ক্রোলভিউ) অভিকর্ষের সেটিংসকে ওভাররাইড করবে।
নীচে স্ক্রোল করার আরও কয়েকটি উপায় এখানে
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- এ আগের কোনও পদ্ধতি কল করার পরে ঘটেছিল, তাই আপনি আপনার সাথে প্রাসঙ্গিক যে কোনও কিছু দ্বারা প্রথম ফুলস্ক্রোল () পদ্ধতিটি প্রতিস্থাপনের চেষ্টা করতে পারেন।
কোটলিন করোটাইনগুলির সাথে এটি করার আরও একটি দুর্দান্ত উপায় রয়েছে। একটি রানলযোগ্য (পোস্ট / পোস্টডিলিয়েড) সহ কোনও হ্যান্ডলারের বিপরীতে কোনও কর্টিন ব্যবহার করার সুবিধাটি হ'ল এটি বিলম্বিত ক্রিয়া সম্পাদন করার জন্য কোনও ব্যয়বহুল থ্রেড জ্বালিয়ে দেয় না।
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/suspend-views/