itsource

Android에서 ScrollView를 프로그래밍 방식으로 스크롤할 수 있습니까?

mycopycode 2022. 7. 17. 00:12
반응형

Android에서 ScrollView를 프로그래밍 방식으로 스크롤할 수 있습니까?

A를 스크롤할 수 있는 방법이 있나요?ScrollView프로그래밍 방식으로 특정 위치로 이동할 수 있습니까?

다이내믹을 생성했습니다.TableLayout에 배치되어 있습니다.ScrollView따라서 특정 동작(버튼 클릭 등)에서 특정 행이 자동으로 맨 위 위치로 스크롤되도록 합니다.

가능합니까?

Pragna의 답변이 항상 유효한 것은 아닙니다.이것을 시험해 보세요.

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);
        } 
});
ScrollView sv = (ScrollView)findViewById(R.id.scrl);
sv.scrollTo(0, sv.getBottom());

또는

sv.scrollTo(5, 10);

scrollView를 onCreateView() 직후(버튼 클릭 후가 아님)로 스크롤하고 싶다.이 기능을 이용하려면 ViewTreeObserver를 사용해야 합니다.

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)ON SDK Lvl < 16

또는

public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)IN SDK Lvl > = 16

여기 좋은 답변들이 많이 있는데, 저는 딱 한 가지만 덧붙이고 싶습니다.ScrollView를 맨 위나 맨 아래로 스크롤하지 않고 레이아웃의 특정 보기로 스크롤해야 할 경우가 있습니다.

간단한 예: 등록 양식에서 양식의 편집 텍스트가 채워지지 않았을 때 사용자가 "등록" 단추를 누르면 해당 편집 텍스트로 스크롤하여 해당 필드를 입력해야 함을 사용자에게 알릴 수 있습니다.

이 경우 다음과 같은 작업을 수행할 수 있습니다.

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

즉석 스크롤 대신 부드러운 스크롤을 원하는 경우:

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

텍스트 편집 대신 모든 유형의 보기를 사용할 수 있습니다.getBottom()은 상위 레이아웃에 따라 뷰의 좌표를 반환하므로 ScrollView 내에서 사용되는 모든 뷰에는 상위 레이아웃(예를 들어 선형 레이아웃)만 있어야 합니다.

ScrollView의 자녀 내에 여러 명의 부모가 있는 경우 부모 뷰에서 requestChildFocus를 호출하는 방법밖에 없습니다.

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

이 경우 부드러운 스크롤이 불가능합니다.

이 답변이 같은 문제를 안고 있는 사람에게 도움이 되었으면 합니다.

다음과 같은 것을 사용합니다.

mScrollView.scrollBy(10, 10);

또는

mScrollView.scrollTo(10, 10);

사용해보십시오.scrollTo메서드 상세 정보

즉시 스크롤할 경우 다음을 사용할 수 있습니다.

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

** 원하는 높이까지 스크롤합니다.좋은 해결책이 떠올랐어요**

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

네, 가능합니다.

라고 가정해봅시다.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);

의 「」로 하는 .Viewtxtview라고 하면, 이 경우는 다음과 같이 적어 주세요.

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

그리고 넌 끝났어.

ScrollView의 맨 아래까지 스크롤하기 위해 이 작업을 수행했습니다(TextView가 안에 있습니다).

(TextView를 갱신하는 메서드에 배치했습니다)

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

주의: 이미 스레드에 들어가 있는 경우, 새로운 포스트 스레드를 작성해야 합니다.그렇지 않으면 (나에게는) 완전히 스크롤되지 않습니다.예:

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

좌표를 포함하지 않는 다른 답변을 추가합니다.

이렇게 하면 원하는 뷰에 초점을 맞출 수 있습니다(최상위 위치에는 표시되지 않습니다).

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

public void Request Child Focus(자녀 표시, 초점 표시)

child - 포커스를 필요로 하는 이 ViewParent의 자식.이 뷰에는 포커스된 뷰가 포함됩니다.실제로 초점을 맞춘 것은 반드시 관점이 아니다.

focused - 실제로 포커스가 있는 아이의 후손인 뷰

페이지 스크롤만:

ScrollView sv = (ScrollView) findViewById(your_scroll_view);
sv.pageScroll(View.FOCUS_DOWN);

다들 너무 복잡한 답을 올리고 있어요.

아래까지 스크롤할 수 있는 쉬운 답을 찾았습니다.

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

나는 이 간단한 해결책을 찾기 위해 많은 연구와 장난을 했다.당신도 도움이 되었으면 좋겠어요! :)

sv.fullScroll(View)에서 Runnable을 사용하고 있었습니다.FOCUS_DOWN) : 이 방법은 즉각적인 문제에 완벽하게 대응합니다.그러나 이 방법을 사용하면 ScrollView가 화면 전체에서 Focus를 가져옵니다.AutoScroll을 매번 실행하면 EditText가 사용자로부터 정보를 수신할 수 없게 되어 버립니다.솔루션은 실행 가능한 아래에 다른 코드를 사용했습니다.

sv.scrollTo(0, sv.getBottom() + sv.getScrollY());

중요한 견해에 초점을 잃지 않고 같은 것을 만드는 것

인사말.

나에겐 효과가 있다

mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mScrollView.post(new Runnable() {
                public void run() {
                    mScrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
    });
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);
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);

        }
    }

언급URL : https://stackoverflow.com/questions/6438061/can-i-scroll-a-scrollview-programmatically-in-android

반응형