Могу ли я прокручивать ScrollView программно в Android?



есть ли способ прокрутить ScrollView программно на определенную позицию?



Я создал dynamic TableLayout который находится в ScrollView. Поэтому я хочу, чтобы это было конкретное действие (например, нажатие кнопки и т. д.) конкретная строка должна автоматически прокручиваться в верхнюю позицию.



это возможно?

592   16  

16 ответов:

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

или

sv.scrollTo(5, 10);

ответ от 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);
        } 
});

Я хотел, чтобы 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);
                }
            });
        }
    });

но будьте осторожны, что это будет называться каждый раз, когда что-то получает layouted (например, если вы установите вид невидимый или подобный) так что не забудьте удалить этот слушатель, если вам это больше не нужно с:

public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) на SDK Lvl

или

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

использовать что-то вроде этого:

mScrollView.scrollBy(10, 10);

или

mScrollView.scrollTo(10, 10);

есть много хороших ответов здесь, но я только хочу добавить одну вещь. Иногда бывает так, что вы хотите прокрутить свой 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);

но в этом случае вы не можете иметь гладкую прокрутку.

Я надеюсь, что этот ответ может помочь кому-то с такой же проблемой.

попробуйте использовать 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 (с TextView внутри):

(Я поставил это на метод, который обновляет TextView)

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

Да, вы можете.

допустим, у вас есть один 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());

и сделано..

Примечание: Если вы уже в потоке, вы должны сделать новый поток post, или это не прокручивать новую длинную высоту до полного конца (для меня). Например:

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

общественного недействительными RequestChildFocus (дочерний вид, Вид на фокусировке)

ребенок - ребенок этого ViewParent, который хочет сосредоточиться. Это представление будет содержать сфокусированное представление. Это не обязательно мнение, которое на самом деле имеет фокус.

вопрос - Вид, который является потомком ребенка, который на самом деле имеет фокус

**для прокрутки до нужной высоты. Я придумал какое-то хорошее решение **

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

просто прокрутите страницу:

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

Я использовал Runnable с sv.fullScroll(вид.FOCUS_DOWN); Он отлично работает для непосредственной проблемы, но этот метод делает ScrollView взять фокус со всего экрана, если вы делаете, что Автопрокрутка происходит каждый раз, никакой EditText не сможет получить информацию от пользователя, мое решение было использовать другой код под runnable:

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

делая то же самое, не теряя внимания на важных просмотров

поздравления.

все публикуют такие сложные ответы.

Я нашел простой ответ, для прокрутки вниз, красиво:

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

и, при необходимости, вы можете поместить вторую строку кода, выше, в runnable:

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

мне потребовалось много исследований и игр, чтобы найти это простое решение. Я надеюсь, что это поможет вам тоже! :)

это работает для меня

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

Comments

    Ничего не найдено.