অ্যান্ড্রয়েড: নীচে স্ক্রোলভিউ বল


200

আমি নীচে সমস্ত পথ শুরু করতে একটি স্ক্রোলভিউ চাই। কোন পদ্ধতি?


1
আমি মনে করি এটি কেবল স্ক্রোলটো (), হ্যাঁ আমি কেবল স্ক্রোলভিউয়ের জন্য ডেভ ডক্স পরীক্ষা করেছি। সহজ কিছু.
নোয়া সিডম্যান

উত্তর:


274

scroll.fullScroll(View.FOCUS_DOWN) এছাড়াও কাজ করা উচিত।

এটি একটি রাখুন scroll.Post(Runnable run)

কোটলিন কোড

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

6
এটি কিছু করার মনে হচ্ছে না, কোনও পরামর্শ? আমি এটি অনক্রিট এবং পরে একটি বোতামের অনক্লিক এ চেষ্টা করেছি।
রিচার্ড জন

এটি ওরিয়েন্টেশন পরিবর্তনে কাজ করছে বলে মনে হচ্ছে না। অন্যথায় এটি কাজ করে।
প্রশান্ত

1
লেআউটটির কল করার আগে ডানদিকে পরিবর্তন করা থাকলে এটি কাজ করে না। পরিবর্তে এটি পোস্ট করা প্রয়োজন।
এমএলপ্রোগ্রামার-সিআইএম

2
এটি এবং নীচে, আপনি সম্পূর্ণরূপে উত্সাহিত করতে ভিউটিকে কিছুটা সময় না দেওয়া পর্যন্ত কাজ করবে না, কেবল এডেমার উত্তরকে সহজ করে। স্ক্রোলভিউ.পোস্টডিলিয়েড (নতুন রান্নেবল () {@ ওভাররাইড পাবলিক শূন্যতম রান () {স্ক্রোলভিউ.ফুলসক্রল (দেখুন.ফোকাস_আপ // বা ডাউন);}}, 1000);
ইঞ্জিনসেন্স

স্ক্রোল.ফুলসক্রোল (View.FOCUS_DOWN) ফোকাস পরিবর্তনের দিকে নিয়ে যাবে। একাধিক ফোকাসযোগ্য ভিউ যেমন দু'টি এডিটেক্সট হবে তখন এটি কিছু অদ্ভুত আচরণ নিয়ে আসবে। নীচে আমি সরবরাহ করি এমন আরও একটি সমাধান দেখুন।
শান্তিময়

332

আপনার এই কোডটি স্ক্রোলের ভিতরে চালানো উচিত p পোস্টের মতো:

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

4
বর্তমান উপাদানটিকে ফোকাস ছাড়াই উপায় আছে, যখন আমি এটি করি আমি আমার বর্তমান উপাদানটির ফোকাসটি হারাব (
স্ক্রোলভিউ

2
এটি কেবলমাত্র সেই ক্ষেত্রে প্রয়োজন যেখানে লেআউটটি এখনও পরিমাপ করা হয়নি এবং লেআউট করা হয়নি (উদাহরণস্বরূপ যদি আপনি এটি অনক্রিটটিতে চালান)। একটি বোতাম টিপানোর মতো ক্ষেত্রে, .পোস্ট () দরকার হয় না।
প্যাট্রিক বুস

12
আপনি যদি স্ক্রোলভিউতে ফোকাস করতে না চান, আপনি scroll.scrollTo(0, scroll.getHeight());নীচে লাফিয়ে বা scroll.smoothScrollTo(0, scroll.getHeight());কোনও মসৃণ স্ক্রোলের জন্য ব্যবহার করতে পারেন
যুবাল

এই কোডটি কি কোনও সম্ভাব্য মেমরি ফাঁস নয়? একটি বেনামে রান্নেবল তৈরি করা হয়েছে যা কোনও ক্রিয়াকলাপ (স্ক্রোল) দর্শনের জন্য একটি রেফারেন্স ধারণ করে। চলমানযোগ্য তার কাজটি সম্পাদন করার সময় যদি কার্যকলাপটি ধ্বংস হয়ে যায়, তবে এটি স্ক্রোলভিউয়ের একটি রেফারেন্স ফাঁস করবে, না?
জেনার

কোটলিনে: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
এটির আরও বেশি পরিমাণে উচিৎ হওয়া উচিত। এটি এখন পর্যন্ত সেরা উত্তর।
এরিক ল্যাঙ্গ

1
এটি এখানে উপস্থিত সেরা উত্তর।
অকার্যকর পয়েন্টার

1
এই পৃষ্ঠায় অন্য কিছুর, এমনকি এর নীচে স্টাফের উপায় চেষ্টা করে। এটি কেবলমাত্র কাজ করেছিল এবং এটির ফলে আমার এডিটেক্সট ফোকাস হারাতে পারে না। ধন্যবাদ.
জোয়েল

কীবোর্ডটি প্রদর্শিত হওয়ার সময় যদি আপনার নিচে স্ক্রোল করতে হয় তবে এই কোডটি এই লাইব্রেরির সাথে একত্র করুন । একটি যাদুমন্ত্র মত কাজ করে.
ওয়ানসুক

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);

সনাক্তকরণের জন্য ধন্যবাদ postDelayed ভাল সমাধান।
প্রশান্ত

@ প্রশান্ত :) :) :)
অজয় শ্রেষ্ঠ 21

1
কেবল মনে রাখবেন যে আপনি ক্রিয়াকলাপটি শেষ করার সময় আপনার রানবেলকে নিষ্পত্তি করতে হবে
FabioR

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();
    }

বিঃদ্রঃ

এই উত্তরটি অ্যান্ড্রয়েডের সত্যিকারের পুরানো সংস্করণের জন্য কার্যকর ar আজকের আর postDelayedকোনও ত্রুটি নেই এবং এটি ব্যবহার করা উচিত।


3
দু'জনের উপরে নয়, তবে এটি আমার ফোনে ভাল কাজ করে (এলজি জেলিবিয়ান 4.1.2 অপ্টিমাস জি)।
ইয়ংজায়ে

9
স্ক্রোলভিউ.পস্টডেলিড (চালানো, ১০০) ব্যবহার করবেন না কেন?
ম্যাট ওল্ফ

1
@ ম্যাটওয়াল্ফ তখন অ্যান্ড্রয়েডের কিছু পুরানো সংস্করণে কাজ করে না। তবে আজ এই উত্তরটি একেবারেই অবহেলা করা হয়েছে।
ademar111190

4
Godশ্বরের ভালবাসার জন্য, স্ক্রোলভিউ.পোস্টডিলেয়েড (চলমান, 100) ব্যবহার করুন! :)
অ্যালেক্স লকউড

1
আমি একটি নোট @AlexLockwood আমি আশা করি মানুষ ব্যবহার যোগ postDelayed:)
ademar111190


3

যখন দৃশ্যটি এখনও লোড করা হয়নি, আপনি স্ক্রোল করতে পারবেন না। উপরের মতো পোস্ট বা স্লিপ কল দিয়ে আপনি এটি 'পরে' করতে পারেন তবে এটি খুব মার্জিত নয়।

স্ক্রোলটি পরিকল্পনা করা এবং পরবর্তী লেআউট () এ এটি করা ভাল। উদাহরণ কোড এখানে:

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


3

একটি বিষয় বিবেচনা করতে হবে তা সেট না করা। আপনার শিশু নিয়ন্ত্রণ নির্দিষ্ট করে নিন, বিশেষত এডিটেক্সট নিয়ন্ত্রণগুলি, রিকোয়েস্টফোকস সম্পত্তি সেট নেই। এটি লেআউটের সর্বশেষ বর্ণিত বৈশিষ্ট্যগুলির মধ্যে একটি হতে পারে এবং এটি তার পিতামাতার (লেআউট বা স্ক্রোলভিউ) অভিকর্ষের সেটিংসকে ওভাররাইড করবে।


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- এ আগের কোনও পদ্ধতি কল করার পরে ঘটেছিল, তাই আপনি আপনার সাথে প্রাসঙ্গিক যে কোনও কিছু দ্বারা প্রথম ফুলস্ক্রোল () পদ্ধতিটি প্রতিস্থাপনের চেষ্টা করতে পারেন।


0

কোটলিন করোটাইনগুলির সাথে এটি করার আরও একটি দুর্দান্ত উপায় রয়েছে। একটি রানলযোগ্য (পোস্ট / পোস্টডিলিয়েড) সহ কোনও হ্যান্ডলারের বিপরীতে কোনও কর্টিন ব্যবহার করার সুবিধাটি হ'ল এটি বিলম্বিত ক্রিয়া সম্পাদন করার জন্য কোনও ব্যয়বহুল থ্রেড জ্বালিয়ে দেয় না।

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

কর্টিনের হ্যান্ডলারকন্টেক্সটকে ইউআই হিসাবে উল্লেখ করা গুরুত্বপূর্ণ, অন্যথায় বিলম্বিত ক্রিয়াকলাপটি ইউআই থ্রেড থেকে ডাকা হবে না।


0

এই ক্ষেত্রে কেবল স্ক্রোল.স্ক্রোলটি ব্যবহার করছিলেন (0, sc.getBottom ()) কাজ করবেন না, স্ক্রোল.পোস্ট ব্যবহার করে এটি ব্যবহার করুন

উদাহরণ:

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/suspend-views/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.