কোনও নির্দিষ্ট সম্পাদনা পাঠ্যে প্রোগ্রামগতভাবে কোনও স্ক্রোল ভিউ স্ক্রোল করার কোনও উপায় আছে কি?


206

আমার খুব দীর্ঘ ক্রিয়াকলাপ রয়েছে একটি স্ক্রোলভিউ নিয়ে। এটি বিভিন্ন ক্ষেত্র সহ একটি ফর্ম যা ব্যবহারকারীকে অবশ্যই পূরণ করতে হবে my প্রোগ্রামটিমে এডিটেক্সট অবজেক্টে (বা অন্য কোনও ভিউ অবজেক্ট) স্ক্রোল করার কোনও উপায় আছে কি?

এছাড়াও, আমি জানি যে এটি এক্স এবং ওয়াই কর্ড ব্যবহার করে সম্ভব তবে ফর্মটি ব্যবহারকারী থেকে ব্যবহারকারী হিসাবে পরিবর্তিত হতে পারে বলে আমি এটি করা এড়াতে চাই।


3
the form may changed from user to userতবে আপনি কেবল ব্যবহার করতে পারেনmEditView.getTop();
নেবক্যাট

1
যদি কেউ CoordinatorLayout মধ্যে NestedScrollView ব্যবহার করছে, আপনি এর মাধ্যমে একটি নির্দিষ্ট দৃশ্যে স্ক্রল করতে পারেন stackoverflow.com/questions/52083678/...
user1506104

উত্তর:


451
private final void focusOnView(){
        your_scrollview.post(new Runnable() {
            @Override
            public void run() {
                your_scrollview.scrollTo(0, your_EditBox.getBottom());
            }
        });
    }

129
আমি দেখতে পেয়েছি যে স্মুথস্ক্রোলটো (0, your_EditBox.getTop ()) ব্যবহার করে আরও ভাল ফলাফল পাওয়া যায় (পছন্দসই ভিউটিতে স্মোল স্ক্রোলিং) তবে এর থেকে অন্য - দুর্দান্ত উত্তর।
মুজিকান্ত

18
@ xmenW.K। সংক্ষিপ্ত উত্তর: কারণ ইউআই তার কাজগুলি করার একটি সারির উপর ভিত্তি করে কাজ করে, এবং আপনি মূলত ইউআই থ্রেডকে বলছেন, যখন আপনি এখন আগে যা করতে হয়েছিল তা করার পরে, এটি করুন (স্ক্রোল) । আপনি মূলত স্ক্রোলটিকে কাতারে রেখে দিচ্ছেন এবং থ্রেডটি যখন এটি করতে পারে তা করতে দেবেন, আপনি অনুরোধ করার আগে এটি যে কাজ করছে তার ক্রমকে সম্মান করে।
মার্টিন মার্কনকিনি

37
নতুন হ্যান্ডলারটি ইনস্ট্যান্ট করার পরিবর্তে নিজেই স্ক্রোলভিউতে রান্নেবল পোস্ট করা সম্ভব:your_scrollview.post(...
শেরিফ এলখতিব

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

5
getBottom () এবং getTop () পিতামাতার সাথে সম্পর্কিত
cambunctious

56

শেরিফ এলখতিব এর উত্তর ব্যাপকভাবে উন্নত করা যেতে পারে, আপনি যদি স্ক্রোল দর্শনের কেন্দ্রে ভিউ স্ক্রোল করতে চান । এই পুনরায় ব্যবহারযোগ্য পদ্ধতিটি মসৃণতাকে একটি অনুভূমিকস্ক্রোলভিউয়ের দৃশ্যমান কেন্দ্রে স্ক্রোল করে।

private final void focusOnView(final HorizontalScrollView scroll, final View view) {
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            int vLeft = view.getLeft();
            int vRight = view.getRight();
            int sWidth = scroll.getWidth();
            scroll.smoothScrollTo(((vLeft + vRight - sWidth) / 2), 0);
        }
    });
}

উল্লম্ব ScrollViewব্যবহারের জন্য

...
int vTop = view.getTop();
int vBottom = view.getBottom();
int sHeight = scroll.getBottom();
scroll.smoothScrollTo(((vTop + vBottom - sHeight) / 2), 0);
...

3
আপনার কোডটি সামঞ্জস্য করতে হবে। আপনাকে স্ক্রোল দর্শনের প্রস্থ পেতে হবে এবং আপনাকে সূত্রটি পরিবর্তন করতে হবে sv.smoothScrolTo ((vLeft + vRight) / 2) - (এসভিউইথ / 2), 0);
প্রাথমিক 12

2
অন্যথায় স্ক্রোলভিউতে দৃশ্যটি কেন্দ্রিক হবে না। আমি ইতিমধ্যে আপনার জন্য সম্পাদনা করেছি।
প্রাথমিক

আপনি কি সূত্রটি
ঠিকঠাকভাবে

1
@ প্রাথমিক আপনার এবং আহমাদস সূত্রগুলি একই বীজগণিত প্রকাশের সরল ও প্রসারিত সংস্করণ, সামঞ্জস্যের প্রয়োজন নেই।
29

1
@ k29 আপনি এখানে দুটি দৃশ্যমান সূত্র উল্লেখ করেন? তারা উভয়ই আমার থেকে, আমি আমার মন্তব্যের সূত্রটি আরও সরল করেছিলাম এবং সেই অনুসারে উত্তরটি সম্পাদনা করেছি। তবে বাকি সমস্তগুলি এখনও মূল উত্তর থেকে একই এবং এটি আমার জন্য খুব সহায়ক ছিল।
প্রাথমিক

51

এটি আমার পক্ষে ভাল কাজ করে:

  targetView.getParent().requestChildFocus(targetView,targetView);

সর্বজনীন শূন্যতা রিকোয়েস্টচিল্ড ফোকাস (শিশু দেখুন, দৃষ্টি নিবদ্ধ করুন দেখুন)

চাইল্ড - এই ভিউপ্যারেন্টের শিশু যা ফোকাস চায়। এই ভিউটিতে ফোকাসযুক্ত ভিউ থাকবে। এটি অগত্যা যে দৃষ্টিভঙ্গিটি আসলে ফোকাস করে তা নয়।

দৃষ্টি নিবদ্ধ করা - এমন দৃষ্টিভঙ্গি যা সন্তানের বংশধর যা আসলে ফোকাস করে


যে কোনও মসৃণ স্ক্রোলের ধরণের জাম্প দেখুন

32

আমার মতে প্রদত্ত আয়তক্ষেত্রটিতে স্ক্রোল করার সর্বোত্তম উপায়টি হল View.requestRectangleOnScreen(Rect, Boolean)। আপনি Viewস্ক্রোল করতে এবং স্ক্রিনে দৃশ্যমান হতে চান এমন কোনও স্থানীয় আয়তক্ষেত্রটি পাস করতে চাইলে আপনাকে এটি কল করা উচিত । দ্বিতীয় প্যারামিটারটি falseমসৃণ স্ক্রোলিং এবং trueতাত্ক্ষণিক স্ক্রোলিংয়ের জন্য হওয়া উচিত ।

final Rect rect = new Rect(0, 0, view.getWidth(), view.getHeight());
view.requestRectangleOnScreen(rect, false);

1
একটি ভিউ পেজারের ভিতরে আমার জন্য কাজ করা আছে সেখানে স্ক্রোলভিউ রয়েছে এবং এখানে বর্ণিত কোডটি ব্যবহার করে এখন কাজ করছে এমন একটি দৃশ্যে স্ক্রোল করা দরকার।
পঙ্কজ

2
অবশ্যই এটির একটি গ্রহণযোগ্য উত্তর হওয়া উচিত, scrollview.smoothScrollToপ্রয়োজনীয় ভিউ স্ক্রিন বন্ধ থাকলে কাজ করবে না, (এসডিকে সংস্করণ 26 সহ অ্যান্ড্রয়েড এমুলেটর চেষ্টা করে দেখেছি)
সনি

@ মিশেল আমাকে কি গুটিয়ে রাখা উচিত new Handler().post()?
জনি পাঁচ

@ জোহনিফাইভ এটি নির্ভর করে আপনি এই কোডটি কোথায় ব্যবহার করেন on
মাইকেল 15

12

ওয়ারেনফেইথের উত্তর অনুসারে আমি একটি ছোট্ট ইউটিলিটি পদ্ধতি তৈরি করেছি, যদি এই ভিউটি ইতিমধ্যে স্ক্রোলভিউতে দৃশ্যমান হয় তবে স্ক্রোলের প্রয়োজন নেই this

public static void scrollToView(final ScrollView scrollView, final View view) {

    // View needs a focus
    view.requestFocus();

    // Determine if scroll needs to happen
    final Rect scrollBounds = new Rect();
    scrollView.getHitRect(scrollBounds);
    if (!view.getLocalVisibleRect(scrollBounds)) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                scrollView.smoothScrollTo(0, view.getBottom());
            }
        });
    } 
}

আমার ধারণা পদ্ধতিটির scrollBoundsপরামিতি হওয়া উচিত scrollView.getHitRect
বিজয় সি


7

আমার এডিটটেক্সটটি আমার স্ক্রোলভিউয়ের ভিতরে বেশ কয়েকটি স্তরকে ঘিরে রেখেছে, যা নিজেই বিন্যাসের মূল দৃষ্টিভঙ্গি নয়। কারণ গেটটপ () এবং গেটবটম () এটির সমন্বিত দর্শনগুলির মধ্যে থাকা স্থানাঙ্কগুলির প্রতিবেদন করার জন্য মনে হচ্ছিল, আমি এডিট টেক্সটের পিতামাতার মাধ্যমে পুনরাবৃত্তি করে স্ক্রোলভিউয়ের শীর্ষ থেকে সম্পাদনা পাঠের শীর্ষে দূরত্বটি গণনা করেছি।

// Scroll the view so that the touched editText is near the top of the scroll view
new Thread(new Runnable()
{
    @Override
    public
    void run ()
    {
        // Make it feel like a two step process
        Utils.sleep(333);

        // Determine where to set the scroll-to to by measuring the distance from the top of the scroll view
        // to the control to focus on by summing the "top" position of each view in the hierarchy.
        int yDistanceToControlsView = 0;
        View parentView = (View) m_editTextControl.getParent();
        while (true)
        {
            if (parentView.equals(scrollView))
            {
                break;
            }
            yDistanceToControlsView += parentView.getTop();
            parentView = (View) parentView.getParent();
        }

        // Compute the final position value for the top and bottom of the control in the scroll view.
        final int topInScrollView = yDistanceToControlsView + m_editTextControl.getTop();
        final int bottomInScrollView = yDistanceToControlsView + m_editTextControl.getBottom();

        // Post the scroll action to happen on the scrollView with the UI thread.
        scrollView.post(new Runnable()
        {
            @Override
            public void run()
            {
                int height =m_editTextControl.getHeight();
                scrollView.smoothScrollTo(0, ((topInScrollView + bottomInScrollView) / 2) - height);
                m_editTextControl.requestFocus();
            }
        });
    }
}).start();

5

আর একটি ভিন্নতা হ'ল:

scrollView.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        scrollView.smoothScrollTo(0, img_transparent.getTop());
    }
}, 2000);

অথবা আপনি post()পদ্ধতিটি ব্যবহার করতে পারেন ।


5

আমি জানি এটির উত্তরের জন্য খুব দেরি হতে পারে তবে একটি পছন্দসই নিখুঁত সমাধান অবশ্যই পজিশনারের মতো সিস্টেম হতে হবে। মানে, যখন সিস্টেম কোনও সম্পাদক ক্ষেত্রের জন্য একটি অবস্থান তৈরি করে তখন ক্ষেত্রটি ঠিক কীবোর্ড পর্যন্ত স্থাপন করে, যাতে ইউআই / ইউএক্স নিয়ম হিসাবে এটি নিখুঁত।

কোডের নীচে যা কিছু করা হয় তা হ'ল অ্যান্ড্রয়েডের উপায়টি সহজেই পজিশনিং করা। সবার আগে আমরা বর্তমান স্ক্রোল পয়েন্টটিকে রেফারেন্স পয়েন্ট হিসাবে রাখি। দ্বিতীয় বিষয়টি হ'ল কোনও সম্পাদকের জন্য সর্বোত্তম অবস্থানের স্ক্রোল পয়েন্টটি সন্ধান করা, এটি করার জন্য আমরা শীর্ষে স্ক্রোল করব এবং তারপরে সম্পাদকের ক্ষেত্রগুলিকে সর্বোত্তম পজিশনিং করতে স্ক্রোলভিউ উপাদান তৈরি করার জন্য অনুরোধ করব। Gatcha! আমরা সেরা অবস্থান শিখেছি। এখন, আমরা যা করব তা হ'ল পূর্ববর্তী বিন্দু থেকে আমরা যে নতুন সন্ধান পেয়েছি সেই পয়েন্টে মসৃণ স্ক্রোল করা। আপনি ব্যবহার করে স্ক্রলিং মসৃণ বাদ পারে চান scrollTo পরিবর্তে smoothScrollTo শুধুমাত্র।

দ্রষ্টব্য: মূল ধারক স্ক্রোলভিউ হ'ল স্ক্রোলভিউসাইনআপ নামে একটি সদস্য ক্ষেত্র, কারণ আমার উদাহরণটি একটি সাইনআপ স্ক্রিন ছিল, কারণ আপনি অনেক কিছু বের করতে পারেন।

view.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(final View view, boolean b) {
            if (b) {
                scrollViewSignup.post(new Runnable() {
                    @Override
                    public void run() {
                        int scrollY = scrollViewSignup.getScrollY();
                        scrollViewSignup.scrollTo(0, 0);
                        final Rect rect = new Rect(0, 0, view.getWidth(), view.getHeight());
                        view.requestRectangleOnScreen(rect, true);

                        int new_scrollY = scrollViewSignup.getScrollY();
                        scrollViewSignup.scrollTo(0, scrollY);
                        scrollViewSignup.smoothScrollTo(0, new_scrollY);
                    }
                });
            }
        }
    });

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

traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);

এবং পদ্ধতি বাস্তবায়ন নীচে হিসাবে আছে।

private void traverseEditTextChildren(ViewGroup viewGroup, View.OnFocusChangeListener focusChangeListenerToScrollEditor) {
    int childCount = viewGroup.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View view = viewGroup.getChildAt(i);
        if (view instanceof EditText)
        {
            ((EditText) view).setOnFocusChangeListener(focusChangeListenerToScrollEditor);
        }
        else if (view instanceof ViewGroup)
        {
            traverseEditTextChildren((ViewGroup) view, focusChangeListenerToScrollEditor);
        }
    }
}

সুতরাং, আমরা এখানে যা করেছি তা হ'ল শ্রোতাকে ফোকাস করার জন্য সমস্ত এডিটেক্সট উদাহরণ শিশুদের তৈরি করছে।

এই সমাধানে পৌঁছানোর জন্য, আমি এখানকার সমস্ত সমাধান এটি পরীক্ষা করে দেখেছি এবং ভাল ইউআই / ইউএক্স ফলাফলের জন্য একটি নতুন সমাধান তৈরি করেছি।

অন্যান্য সমস্ত উত্তর অনেক ধন্যবাদ আমাকে অনেক অনুপ্রাণিত।

3

উপরের উত্তরগুলি ঠিকঠাক কাজ করবে যদি স্ক্রলভিউ চাইল্ডভিউয়ের সরাসরি পিতামাতা হয়। যদি আপনার চাইল্ডভিউ স্ক্রোলভিউতে অন্য ভিউগ্রুপে আবৃত হচ্ছে, এটি অপ্রত্যাশিত আচরণের কারণ হবে কারণ ভিউজেটটপ () তার পিতামাতার সাথে সম্পর্কিত অবস্থান পেয়েছে। এই ক্ষেত্রে, আপনার এটি প্রয়োগ করা দরকার:

public static void scrollToInvalidInputView(ScrollView scrollView, View view) {
    int vTop = view.getTop();

    while (!(view.getParent() instanceof ScrollView)) {
        view = (View) view.getParent();
        vTop += view.getTop();
    }

    final int scrollPosition = vTop;

    new Handler().post(() -> scrollView.smoothScrollTo(0, scrollPosition));
}

এটি সর্বাধিক ব্যাপক সমাধান কারণ এটি পিতামাতার অবস্থানগুলির জন্যও অ্যাকাউন্ট করে accounts পোস্ট করার জন্য ধন্যবাদ!
গুস্তাভো বায়োচি কোস্টা


2

আমি মনে করি ব্যবহার করে আমি আরও মার্জিত এবং কম ত্রুটির প্রবণ সমাধান পেয়েছি

ScrollView.requestChildRectangleOnScreen

কোনও গণিত জড়িত নেই এবং অন্যান্য প্রস্তাবিত সমাধানগুলির বিপরীতে, এটি উপরে এবং নীচে উভয়ই সঠিকভাবে স্ক্রোলিং পরিচালনা করবে।

/**
 * Will scroll the {@code scrollView} to make {@code viewToScroll} visible
 * 
 * @param scrollView parent of {@code scrollableContent}
 * @param scrollableContent a child of {@code scrollView} whitch holds the scrollable content (fills the viewport).
 * @param viewToScroll a child of {@code scrollableContent} to whitch will scroll the the {@code scrollView}
 */
void scrollToView(ScrollView scrollView, ViewGroup scrollableContent, View viewToScroll) {
    Rect viewToScrollRect = new Rect(); //coordinates to scroll to
    viewToScroll.getHitRect(viewToScrollRect); //fills viewToScrollRect with coordinates of viewToScroll relative to its parent (LinearLayout) 
    scrollView.requestChildRectangleOnScreen(scrollableContent, viewToScrollRect, false); //ScrollView will make sure, the given viewToScrollRect is visible
}

এই মুহুর্তে যদি কেসটি পরিবর্তিত হচ্ছে postDelayedতবে এটিকে আরও নির্ভরযোগ্য করার জন্য এটি মুড়িয়ে ফেলা ভাল ধারণাScrollView

/**
 * Will scroll the {@code scrollView} to make {@code viewToScroll} visible
 * 
 * @param scrollView parent of {@code scrollableContent}
 * @param scrollableContent a child of {@code scrollView} whitch holds the scrollable content (fills the viewport).
 * @param viewToScroll a child of {@code scrollableContent} to whitch will scroll the the {@code scrollView}
 */
private void scrollToView(final ScrollView scrollView, final ViewGroup scrollableContent, final View viewToScroll) {
    long delay = 100; //delay to let finish with possible modifications to ScrollView
    scrollView.postDelayed(new Runnable() {
        public void run() {
            Rect viewToScrollRect = new Rect(); //coordinates to scroll to
            viewToScroll.getHitRect(viewToScrollRect); //fills viewToScrollRect with coordinates of viewToScroll relative to its parent (LinearLayout) 
            scrollView.requestChildRectangleOnScreen(scrollableContent, viewToScrollRect, false); //ScrollView will make sure, the given viewToScrollRect is visible
        }
    }, delay);
}

1

অ্যান্ড্রয়েড উত্স কোড পরীক্ষা করে আপনি দেখতে পাবেন যে এরই মধ্যে এর একটি সদস্য ফাংশন রয়েছে ScrollView- scrollToChild(View)যা অনুরোধ করা হয়েছে ঠিক তাই করে। দুর্ভাগ্যক্রমে, এই ফাংশনটি কিছু অস্পষ্ট কারণে চিহ্নিত হয়েছে private। সেই ফাংশনের উপর ভিত্তি করে আমি নিম্নলিখিত ফাংশনটি লিখেছি যা পরামিতি হিসাবে নির্দিষ্ট করা প্রথমটির ScrollViewউপরে খুঁজে পায় Viewএবং এটি স্ক্রোল করে যাতে এটি এর মধ্যে দৃশ্যমান হয় ScrollView:

 private void make_visible(View view)
 {
  int vt = view.getTop();
  int vb = view.getBottom();

  View v = view;

  for(;;)
     {
      ViewParent vp = v.getParent();

      if(vp == null || !(vp instanceof ViewGroup))
         break;

      ViewGroup parent = (ViewGroup)vp;

      if(parent instanceof ScrollView)
        {
         ScrollView sv = (ScrollView)parent;

         // Code based on ScrollView.computeScrollDeltaToGetChildRectOnScreen(Rect rect) (Android v5.1.1):

         int height = sv.getHeight();
         int screenTop = sv.getScrollY();
         int screenBottom = screenTop + height;

         int fadingEdge = sv.getVerticalFadingEdgeLength();

         // leave room for top fading edge as long as rect isn't at very top
         if(vt > 0)
            screenTop += fadingEdge;

         // leave room for bottom fading edge as long as rect isn't at very bottom
         if(vb < sv.getChildAt(0).getHeight())
            screenBottom -= fadingEdge;

         int scrollYDelta = 0;

         if(vb > screenBottom && vt > screenTop) 
           {
            // need to move down to get it in view: move down just enough so
            // that the entire rectangle is in view (or at least the first
            // screen size chunk).

            if(vb-vt > height) // just enough to get screen size chunk on
               scrollYDelta += (vt - screenTop);
            else              // get entire rect at bottom of screen
               scrollYDelta += (vb - screenBottom);

             // make sure we aren't scrolling beyond the end of our content
            int bottom = sv.getChildAt(0).getBottom();
            int distanceToBottom = bottom - screenBottom;
            scrollYDelta = Math.min(scrollYDelta, distanceToBottom);
           }
         else if(vt < screenTop && vb < screenBottom) 
           {
            // need to move up to get it in view: move up just enough so that
            // entire rectangle is in view (or at least the first screen
            // size chunk of it).

            if(vb-vt > height)    // screen size chunk
               scrollYDelta -= (screenBottom - vb);
            else                  // entire rect at top
               scrollYDelta -= (screenTop - vt);

            // make sure we aren't scrolling any further than the top our content
            scrollYDelta = Math.max(scrollYDelta, -sv.getScrollY());
           }

         sv.smoothScrollBy(0, scrollYDelta);
         break;
        }

      // Transform coordinates to parent:
      int dy = parent.getTop()-parent.getScrollY();
      vt += dy;
      vb += dy;

      v = parent;
     }
 }

1

আমার সমাধানটি হ'ল:

            int[] spinnerLocation = {0,0};
            spinner.getLocationOnScreen(spinnerLocation);

            int[] scrollLocation = {0, 0};
            scrollView.getLocationInWindow(scrollLocation);

            int y = scrollView.getScrollY();

            scrollView.smoothScrollTo(0, y + spinnerLocation[1] - scrollLocation[1]);

1
 scrollView.post(new Runnable() {
                    @Override
                    public void run() {
                        scrollView.smoothScrollTo(0, myTextView.getTop());

                    }
                });

আমার ব্যবহারিক প্রকল্প থেকে উত্তর।

এখানে চিত্র বর্ণনা লিখুন


0

আমার ক্ষেত্রে, এটা না EditText, যে googleMap। এবং এটি সফলভাবে এটি কাজ করে।

    private final void focusCenterOnView(final ScrollView scroll, final View view) {
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            int centreX=(int) (view.getX() + view.getWidth()  / 2);
            int centreY= (int) (view.getY() + view.getHeight() / 2);
            scrollView.smoothScrollBy(centreX, centreY);
        }
    });
}

0

ক্যু: কোনও নির্দিষ্ট সম্পাদনা পাঠ্যে প্রোগ্রামগতভাবে কোনও স্ক্রোল ভিউ স্ক্রোল করার কোনও উপায় আছে?

উত্তর: পুনর্ব্যবহারযোগ্য ভিউতে নেস্টেড স্ক্রোল ভিউ সর্বশেষ পজিশনে রেকর্ড ডেটা যুক্ত করেছে।

adapter.notifyDataSetChanged();
nested_scroll.setScrollY(more Detail Recycler.getBottom());

কোনও নির্দিষ্ট সম্পাদনা পাঠ্যে প্রোগ্রামগতভাবে কোনও স্ক্রোল ভিউ স্ক্রোল করার কোনও উপায় আছে কি?



0

নিম্নলিখিতটি আমি ব্যবহার করছি:

int amountToScroll = viewToShow.getBottom() - scrollView.getHeight() + ((LinearLayout.LayoutParams) viewToShow.getLayoutParams()).bottomMargin;
// Check to see if scrolling is necessary to show the view
if (amountToScroll > 0){
    scrollView.smoothScrollTo(0, amountToScroll);
}

এই দৃশ্যের নীচে যে কোনও মার্জিন সহ ভিউয়ের নীচেটি দেখানোর জন্য প্রয়োজনীয় স্ক্রোল পরিমাণ পাওয়া যায়।


0

উল্লম্ব স্ক্রোল, ফর্মগুলির জন্য ভাল। উত্তরটি আহমাদালিবলোক অনুভূমিক স্ক্রোলের উপর ভিত্তি করে।

private final void focusOnView(final HorizontalScrollView scroll, final View view) {
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            int top = view.getTop();
            int bottom = view.getBottom();
            int sHeight = scroll.getHeight();
            scroll.smoothScrollTo(0, ((top + bottom - sHeight) / 2));
        }
    });
}

আপনি কি নিশ্চিত যে HorizontalScrollViewএই পদ্ধতিতে আপনার একটি ব্যবহার করা উচিত ?
শাহুদ উল হাসান


0

শরিফের উত্তরের ভিত্তিতে, নিম্নলিখিতগুলি আমার ব্যবহারের ক্ষেত্রে সবচেয়ে ভাল কাজ করেছে। উল্লেখযোগ্য পরিবর্তনগুলি getTop()পরিবর্তে getBottom()এবং smoothScrollTo()পরিবর্তে হয় scrollTo()

    private void scrollToView(final View view){
        final ScrollView scrollView = findViewById(R.id.bookmarksScrollView);
        if(scrollView == null) return;

        scrollView.post(new Runnable() {
            @Override
            public void run() {
                scrollView.smoothScrollTo(0, view.getTop());
            }
        });
    }

-1

যদি স্ক্রলমাইন আপনার নেস্টেডস্ক্রোলভিউ হয় তবে নিম্নলিখিতগুলি ব্যবহার করুন,

scrlMain.post(new Runnable() {
                    @Override
                    public void run() {
                        scrlMain.fullScroll(View.FOCUS_UP);

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