Intereting Posts
Android: Как сделать пусковую установку всегда открывать основное действие, а не активность ребенка? (или иным образом) Элементы ListView не доступны для кликов. Зачем? Избыточная прибыль при добавлении ImageView в ScrollView в Android Цель описанияСодержание () Parcelable interface Форма андроида в форме Как оживить ImageView от центра урожая, чтобы заполнить экран и наоборот (стиль facebook)? Создание AsyncTask вызывает сбой Кордоба платформы добавить android не работает при перечислении Android целей PreferenceActivity с несколькими файлами предпочтений Android AudioRecord class – быстро запускает звук в реальном времени, настраивает функцию обратного вызова Cordova + Android – android-windowSoftInputMode adjustPan не работает Не удалось настроить SDK: Ошибка: модуль «приложение»: платформа «Google Inc.:Google APIs: 21» не найден Android. Получение размера изображения из его идентификатора ресурса Гибридные мобильные приложения, как правило, считаются уступающими по отношению к собственным приложениям разработчиками в технологической отрасли? Как избавиться от подозрительного вызова на Android Studio?

Прокрутите до определенного вида в режиме прокрутки

Я добавил scrollview и subchilds внутри scrollview. В какой-то момент мне нужно перейти к определенному виду.

<scrollview> 1. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 2. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 3. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 4. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 5. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 6. <linearlayout> <textview></textview> <textview></textview> </linearlayout> 7. <linearlayout> <textview></textview> <textview></textview> </linearlayout> <button> </button> </scrollview> 

Вышеуказанный макет был создан динамически. Поэтому я не могу опубликовать xml-файл. Создание макета полностью динамично. Даже количество детского просмотра внутри линейного расписания также может меняться.

Поэтому, когда я нажимаю на кнопку, мне нужно прокрутить ее до определенного вида, скажем, здесь, когда я нажимаю кнопку, мне нужно прокрутить до линейного макета 4. Я пробовал с помощью метода scrollTo, но он прокручивается вверху прокрутки.

Пожалуйста, предоставьте несколько предложений.

Solutions Collecting From Web of "Прокрутите до определенного вида в режиме прокрутки"

Это должно сделать трюк:

 View targetView = findViewById(R.id.DESIRED_VIEW_ID); targetView.getParent().requestChildFocus(targetView,targetView); 

Public void RequestChildFocus (просмотр дочернего элемента, просмотр сфокусирован)

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

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

Если ребенок, который нам нужно прокрутить, не является прямым потомком, то выше решения не работают

Я использовал ниже решение в своем проекте, обмен его может быть полезным для других

 /** * Used to scroll to the given view. * * @param scrollViewParent Parent ScrollView * @param view View to which we need to scroll. */ private void scrollToView(final ScrollView scrollViewParent, final View view) { // Get deepChild Offset Point childOffset = new Point(); getDeepChildOffset(scrollViewParent, view.getParent(), view, childOffset); // Scroll to child. scrollViewParent.smoothScrollTo(0, childOffset.y); } /** * Used to get deep child offset. * <p/> * 1. We need to scroll to child in scrollview, but the child may not the direct child to scrollview. * 2. So to get correct child position to scroll, we need to iterate through all of its parent views till the main parent. * * @param mainParent Main Top parent. * @param parent Parent. * @param child Child. * @param accumulatedOffset Accumalated Offset. */ private void getDeepChildOffset(final ViewGroup mainParent, final ViewParent parent, final View child, final Point accumulatedOffset) { ViewGroup parentGroup = (ViewGroup) parent; accumulatedOffset.x += child.getLeft(); accumulatedOffset.y += child.getTop(); if (parentGroup.equals(mainParent)) { return; } getDeepChildOffset(mainParent, parentGroup.getParent(), parentGroup, accumulatedOffset); } 

попробуй это:

 ScrollView sv = // your scrollview View insideView = // find the View that you need to scroll to which is inside this ScrollView sv.scrollTo(0, (int)insideView.getY()); 

insideView.getY() не будет работать ниже уровня API 11, для уровня API ниже 11 вы можете заменить insideView.getY() с помощью insideView.getTop()

Я думаю, что я нашел более элегантное и подверженное ошибкам решение, используя

ScrollView.requestChildRectangleOnScreen

Никакая математика не участвует, и вопреки другим предлагаемым решениям она будет обрабатывать правильную прокрутку в обоих направлениях вверх и вниз.

 void scrollToRow(ScrollView scrollView, LinearLayout linearLayout, TextView textViewToShow) { Rect textRect = new Rect(); //coordinates to scroll to textViewToShow.getHitRect(textRect); //fills textRect with coordinates of TextView relative to its parent (LinearLayout) scrollView.requestChildRectangleOnScreen(linearLayout, textRect, false); //ScrollView will make sure, the given textRect is visible } 

Это хорошая идея, чтобы обернуть его в postDelayed чтобы сделать его более надежным, в случае изменения ScrollView в данный момент

 private void scrollToRow(final ScrollView scrollView, final LinearLayout linearLayout, final TextView textViewToShow) { long delay = 100; //delay to let finish with possible modifications to ScrollView scrollView.postDelayed(new Runnable() { public void run() { Rect textRect = new Rect(); //coordinates to scroll to textViewToShow.getHitRect(textRect); //fills textRect with coordinates of TextView relative to its parent (LinearLayout) scrollView.requestChildRectangleOnScreen(linearLayout, textRect, false); //ScrollView will make sure, the given textRect is visible } }, delay); } 

Просто приятно, не так?

Так как вы можете узнать ребенка LinearLayout который вам нужно прокрутить, как насчет этого.

 ScrollView sv = // your scrollview View highlightedItem = // find the LinearLayout or View that you need to scroll to which is inside this ScrollView sv.scrollTo(0, highlightedItem.getY()); 

Дополнительная информация о scrollTo, а также smoothScrollTo

Вот решение, которое работает, если целевое представление не является прямым дочерним элементом вашего ScrollView:

 public int findYPositionInView (View rootView, View targetView) { return findYPositionInView (rootView, targetView, 0); } // returns -1 if targetView not found private int findYPositionInView (View rootView, View targetView, int yCumulative) { if (rootView == targetView) return yCumulative; if (rootView instanceof ViewGroup) { ViewGroup parentView = (ViewGroup)rootView; for (int i = 0; i < parentView.getChildCount (); i++) { View child = parentView.getChildAt (i); int yChild = yCumulative + (int)child.getY (); int yNested = findYPositionInView (child, targetView, yChild); if (yNested != -1) return yNested; } } return -1; // not found } 

Используйте его так:

 int yScroll = findYPositionInView (scrollView, targetView); scrollView.scrollTo (0, yScroll); 

Кроме того, если вы хотите установить фокус, сделайте следующее:

 targetView.requestFocus (); 

И, если вы хотите, чтобы клавиатура отображалась, сделайте следующее:

 if (targetView instanceof EditText) { targetView.post (new Runnable () { @Override public void run () { InputMethodManager imm = (InputMethodManager)context.getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (targetView, InputMethodManager.SHOW_FORCED); } }); } 

Использование:

 final ScrollView scrollView= (ScrollView) int speed=1000; findViewById(R.id.main_scrollView); final View view = findViewById(R.id.your_view); ViewTreeObserver vto = view.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); ObjectAnimator.ofInt(scrollView, "scrollY", (int) view.getY()).setDuration(speed).start(); } }); 

Попробуйте вызвать view.requestFocus() в представлении, которое вы хотите прокрутить.