আমি কি অ্যান্ড্রয়েডে প্রোগ্রামলিকভাবে কোনও স্ক্রোলভিউ স্ক্রোল করতে পারি?


145

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

আমি গতিশীল তৈরি করেছি TableLayoutযা একটিতে স্থাপন করা হয়েছেScrollView । সুতরাং আমি চাই যে একটি নির্দিষ্ট ক্রিয়াতে (যেমন একটি বোতামে ক্লিক করা ইত্যাদি) নির্দিষ্ট সারিটি স্বয়ংক্রিয়ভাবে একটি শীর্ষ অবস্থানে স্ক্রোল করা উচিত।

এটা কি সম্ভব?

উত্তর:


165
ScrollView sv = (ScrollView)findViewById(R.id.scrl);
sv.scrollTo(0, sv.getBottom());

অথবা

sv.scrollTo(5, 10);


43
এর্কুর উত্তর এবং এটিতে করা মন্তব্যের সংমিশ্রণ, সর্বোত্তম উপায়টি মনে হচ্ছে:mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } });
স্প্যারোলেট

2
স্ক্রোলটো () ইচ্ছার ফলাফল পুনরুদ্ধার করবে না। একজনের সাথে পুরো স্ক্রোল () যেতে হবে
অমিত যাদব

3
প্রাকৃতিক প্রভাব সহ আরও সুন্দর স্ক্রোলটি রয়েছে: এসভি.স্মোথস্ক্রোলটো (5, 10)
ivan.panasiuk

205

প্রাগনার উত্তর সর্বদা কার্যকর হয় না, চেষ্টা করে দেখুন:

mScrollView.post(new Runnable() { 
        public void run() { 
             mScrollView.scrollTo(0, mScrollView.getBottom());
        } 
});

অথবা

mScrollView.post(new Runnable() { 
        public void run() { 
             mScrollView.fullScroll(mScrollView.FOCUS_DOWN);
        } 
});

আপনি যদি শুরু করতে স্ক্রোল করতে চান

mScrollView.post(new Runnable() { 
        public void run() { 
             mScrollView.fullScroll(mScrollView.FOCUS_UP);
        } 
});

28
আমি mScrollView.fullScroll(mScrollView.FOCUS_DOWN);সাফল্যের সাথে ব্যবহার করেছি ।
এএমসিসি

3
আমি ভ্যানথেলের অনুসন্ধানগুলি নিশ্চিত করতে পারি। mScrollView.fullScrol একটি পোস্টে চালানো সম্ভব কৌশলটি করেছে।
অ্যালানকলে

1
দুর্দান্ত! আসলে, রান রানযোগ্য ছাড়া এটি কার্যকর হয়নি। এখন এটা কাজ করছে ! :)
Regis_AG

5
@ হিটেশধামশানিয়া আপনি যদি একটি মসৃণ স্ক্রোল চান তবে চেষ্টা করুন mScrollView.smoothScrollTo(0, mScrollView.getBottom());
মাইক অরটিজ

1
কেন postএখানে এটি প্রয়োজন ?
লাইটিং

35

আমি চেয়েছিলাম যে স্ক্রোলভিউটি অনক্রিটভিউ () এর পরে সরাসরি স্ক্রোল করে (যেমন বাটন ক্লিকের পরে নয়)। এটি কাজ করতে আমার একটি ভিউ ট্রিউবার্সবার ব্যবহার করা প্রয়োজন:

mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mScrollView.post(new Runnable() {
                public void run() {
                    mScrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
    });

তবে সাবধান থাকুন যে কোনও কিছু বিনষ্ট হওয়ার পরে এটিকে বলা হবে (যেমন আপনি যদি কোনও দৃশ্য অদৃশ্য বা অনুরূপ সেট করেন) তবে আপনার আর যদি এটির প্রয়োজন না হয় তবে এই শ্রোতার অপসারণ করতে ভুলবেন না:

public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) SDK Lvl <16 এ

অথবা

public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) এসডিকে এলভিএল> = 16 এ


23

এখানে অনেক ভাল উত্তর আছে, তবে আমি কেবল একটি জিনিস যুক্ত করতে চাই। এটি কখনও কখনও ঘটে যায় যে আপনি উপরে বা নীচে সম্পূর্ণ স্ক্রোলের পরিবর্তে আপনার স্ক্রোলভিউটিকে বিন্যাসের একটি নির্দিষ্ট দৃশ্যে স্ক্রোল করতে চান।

একটি সাধারণ উদাহরণ: একটি রেজিস্ট্রেশন ফর্মে, যদি ফর্মের সম্পাদনা পাঠ্যটি পূরণ না করা হয় যখন ব্যবহারকারী "সাইনআপ" বোতামটি ট্যাপ করেন, ব্যবহারকারীকে অবশ্যই সেই ফিল্ডটি পূরণ করতে হবে তা বলতে আপনি সেই নির্দিষ্ট সম্পাদনা পাঠ্যে স্ক্রোল করতে চান।

সেক্ষেত্রে আপনি এর মতো কিছু করতে পারেন:

scrollView.post(new Runnable() { 
        public void run() { 
             scrollView.scrollTo(0, editText.getBottom());
        } 
});

বা, যদি আপনি তাত্ক্ষণিক স্ক্রোলের পরিবর্তে মসৃণ স্ক্রোল চান:

scrollView.post(new Runnable() { 
            public void run() { 
                 scrollView.smoothScrollTo(0, editText.getBottom());
            } 
    });

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

স্ক্রোলভিউয়ের সন্তানের ভিতরে যদি আপনার একাধিক বাবা-মা থাকে তবে আমি খুঁজে পেলাম একমাত্র সমাধান প্যারেন্ট ভিউতে অনুরোধচিল্ডফোকাসকে কল করা:

editText.getParent().requestChildFocus(editText, editText);

তবে এক্ষেত্রে আপনার কোনও মসৃণ স্ক্রোল থাকতে পারে না।

আমি আশা করি এই উত্তরটি একই সমস্যার সাথে কাউকে সহায়তা করতে পারে।


1
@JohnT লাগছে এটা আপনাকে সাহায্য :)
Mattia Ruggiero



8

আপনি যদি তাত্ক্ষণিকভাবে স্ক্রোল করতে চান তবে আপনি ব্যবহার করতে পারেন:

ScrollView scroll= (ScrollView)findViewById(R.id.scroll);
scroll.scrollTo(0, scroll.getBottom());

            OR

scroll.fullScroll(View.FOCUS_DOWN);

            OR

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

অথবা আপনি যদি সহজে এবং ধীরে ধীরে স্ক্রোল করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

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

কি যে আছে catchব্লক করবেন?
জন সারদিনহা

1
ক্যাচ ব্লক হ'ল স্ক্রলিংয়ের সময় যদি কিছু পাওয়া যায় তবে ব্যতিক্রমগুলি ধরা হয়।
ম্যাডি

5

** পছন্দসই উচ্চতা পর্যন্ত স্ক্রোল করতে। আমি কিছু ভাল সমাধান নিয়ে এসেছি **

                scrollView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        scrollView.scrollBy(0, childView.getHeight());
                    }
                }, 100);

4

আমি এটি একটি স্ক্রোলভিউয়ের নীচে স্ক্রোল করার জন্য কাজ করতে পেরেছি (ভিতরে একটি টেক্সটভিউ সহ):

(আমি এটি এমন একটি পদ্ধতিতে রেখেছি যা টেক্সটভিউ আপডেট করে)

final ScrollView myScrollView = (ScrollView) findViewById(R.id.myScroller);
    myScrollView.post(new Runnable() {
    public void run() {
        myScrollView.fullScroll(View.FOCUS_DOWN);
    }
});

4

হ্যা, তুমি পারো.

ধরা যাক আপনি একটি পেয়েছেন Layoutএবং তার ভিতরে, আপনি অনেক পেয়েছেন Views। সুতরাং আপনি যদি কোনও Viewপ্রোগ্রামগতভাবে স্ক্রোল করতে চান তবে আপনাকে নীচের কোড স্নিপেট লিখতে হবে:

উদাহরণ স্বরূপ:

content_main.xml

<ScrollView
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/txtView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>
</ScrollView>

MainActivity.java

ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView);
Button btn = (Button) findViewById(R.id.ivEventBanner);
TextView txtView = (TextView) findViewById(R.id.ivEditBannerImage);

আপনি যদি কোনও নির্দিষ্টটিতে স্ক্রোল করতে চান Viewতবে txtview বলুন, এক্ষেত্রে কেবল লিখুন:

scrollView.smoothScrollTo(txtView.getScrollX(),txtView.getScrollY());

এবং আপনি সম্পন্ন হয়েছে।


3

দ্রষ্টব্য: আপনি যদি ইতিমধ্যে কোনও থ্রেডে থাকেন তবে আপনাকে একটি নতুন পোস্ট থ্রেড তৈরি করতে হবে, অথবা এটি সম্পূর্ণ দীর্ঘ (আমার জন্য) অবধি নতুন দীর্ঘ উচ্চতা স্ক্রোল করছে না। প্রাক্তন হিসাবে:

void LogMe(final String s){
    runOnUiThread(new Runnable() {
        public void run() {
            connectionLog.setText(connectionLog.getText() + "\n" + s);
            final ScrollView sv = (ScrollView)connectLayout.findViewById(R.id.scrollView);
            sv.post(new Runnable() {
                public void run() {
                    sv.fullScroll(sv.FOCUS_DOWN);
                    /*
                    sv.scrollTo(0,sv.getBottom());
                    sv.scrollBy(0,sv.getHeight());*/
                }
            });
        }
    });
}

3

স্থানাঙ্ক জড়িত না এমন অন্য উত্তর যুক্ত করা।

এটি আপনার কাঙ্ক্ষিত দৃষ্টিভঙ্গিকে ফোকাসে আনবে (তবে শীর্ষ অবস্থানে নয়):

  yourView.getParent().requestChildFocus(yourView,yourView);

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

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

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


ঠিক আমার যা প্রয়োজন, ধন্যবাদ। আপনার জন্য প্রথমে অনুরোধ ফোকাস ভিউ স্ক্রোল করুন এবং তারপরে স্ক্রোলভিউ.স্মোথস্ক্রোলটো (0, স্ক্রোলভিউ.সেটচিল্ডটি (0)। বিটবটম ());
ভলোভিক ভুকাসিন


2

সবাই এ জাতীয় জটিল উত্তর পোস্ট করছে।

নীচে স্ক্রোলিংয়ের জন্য আমি একটি সহজ উত্তর পেয়েছি, সুন্দরভাবে:

final ScrollView myScroller = (ScrollView) findViewById(R.id.myScrollerView);

// Scroll views can only have 1 child, so get the first child's bottom,
// which should be the full size of the whole content inside the ScrollView
myScroller.smoothScrollTo( 0, myScroller.getChildAt( 0 ).getBottom() );

এবং, যদি প্রয়োজন হয়, আপনি কোডের দ্বিতীয় লাইনটিকে উপরের দিকে চালানো যেতে পারে:

myScroller.post( new Runnable() {
    @Override
    public void run() {
        myScroller.smoothScrollTo( 0, myScroller.getChildAt( 0 ).getBottom() );
    }
}

এই সহজ সমাধানটি খুঁজে পেতে আমাকে অনেক গবেষণা এবং চারপাশে খেলতে লাগল। আমি এটা খুব সাহায্য করে আশা করি! :)


1

আমি sv.fullScrol (View.FOCUS_DOWN) সহ রান্নেবল ব্যবহার করছিলাম; এটি তাত্ক্ষণিক সমস্যার জন্য নিখুঁতভাবে কাজ করে, তবে সেই পদ্ধতিটি স্ক্রোলভিউকে পুরো স্ক্রীন থেকে ফোকাস নিতে বাধ্য করে, আপনি যদি প্রতিবার অটোস্ক্রোলটি ঘটায় তবে কোনও সম্পাদনা পাঠ্যর ব্যবহারকারীর কাছ থেকে তথ্য গ্রহণ করতে সক্ষম হবে না, আমার সমাধানটি একটি আলাদা কোড ব্যবহার করেছিল চলমান অধীনে:

sv.scrolTo (0, sv.getBottom () + sv.getScrolY ());

গুরুত্বপূর্ণ দৃষ্টিভঙ্গিতে মনোনিবেশ না করে একই তৈরি করা making

শুভেচ্ছা।


0

এটা আমার জন্য কাজ করছে

mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mScrollView.post(new Runnable() {
                public void run() {
                    mScrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
    });

0
private int totalHeight = 0;

ViewTreeObserver ScrollTr = loutMain.getViewTreeObserver();
ScrollTr.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            loutMain.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        } else {
            loutMain.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
        TotalHeight = loutMain.getMeasuredHeight();

    }
});

scrollMain.smoothScrollTo(0, totalHeight);

0
I had to create Interface

public interface ScrollViewListener {
    void onScrollChanged(ScrollViewExt scrollView, 
                         int x, int y, int oldx, int oldy);
}    

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;

public class CustomScrollView extends ScrollView {
    private ScrollViewListener scrollViewListener = null;
    public ScrollViewExt(Context context) {
        super(context);
    }

    public CustomScrollView (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CustomScrollView (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
        }
    }
}




<"Your Package name ".CustomScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusableInTouchMode="true"
    android:scrollbars="vertical">

    private CustomScrollView scrollView;

scrollView = (CustomScrollView)mView.findViewById(R.id.scrollView);
        scrollView.setScrollViewListener(this);


    @Override
    public void onScrollChanged(ScrollViewExt scrollView, int x, int y, int oldx, int oldy) {
        // We take the last son in the scrollview
        View view = (View) scrollView.getChildAt(scrollView.getChildCount() - 1);
        int diff = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY()));

        // if diff is zero, then the bottom has been reached
        if (diff == 0) {
                // do stuff
            //TODO keshav gers
            pausePlayer();
            videoFullScreenPlayer.setVisibility(View.GONE);

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