2013-08-12 2 views
1

У меня есть ScrollView с много кнопок. Каждая кнопка активируется, когда пользователь открывает эту кнопку/уровень. Я хотел бы сфокусировать ScrollView на последней разблокированной кнопке/уровне. См. Снимок экрана ниже.Focus ScrollView в выбранное положение программно - Android

enter image description here

Я нашел некоторые функции, такие как scrollTo(), которые могли бы сосредоточить либо на вершине, кнопки Scrollview или что-то подобное, но я хотел бы сосредоточить Scrollview в определенных местах, таких как кнопки ID, который говорит Level 8 на скриншоте ниже. Как мне это сделать?

ответ

0

см: http://developer.android.com/reference/android/widget/ListView.html#setSelectionFromTop(int, Int)

  • 'INT selectedLevel' имеет выбранный уровень, информация хранится в Level классе.
  • «values» - это список со всеми вашими уровнями, отображаемый в списке.

Пример:

ListView lv = (ListView)findViewById(android.R.id.list); 
    int i = 0; 
    for (Level l : values) { 
     i++; 
     if (l.level == selectedLevel) { 
      lv.setSelectionFromTop(i, 200); 
      break; 
     } 
    } 
1

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

final int x; 
      final int y; 
      x = rowview[pos].getLeft(); 
      y = rowView[pos].getTop(); 

       yourScrollView.scrollTo(x, y); 

см. this question

1

Я согласен с преимуществами предыдущих ответов. Однако, по опыту, я нашел это более сложным, чем это. SetSelectionFromTop очень чувствителен и часто ломается, если он выполняется слишком рано. Это может зависеть от разных причин, но две основные причины таковы:

  • Если выполнено из методов жизненного цикла работ, представления еще не загружены/настроены.
  • Просмотреть изменения, вызванные после того, как действие перемещения списка, похоже, нарушит движение. Вероятно, переписывая некоторую ценность до того, как переход был завершен из-за пересчета просмотров.

Рассуждение кажется применять как для setSelectionFromTop и setSelection() методы, хотя я тестировал в основном с setSelectionFromTop. smoothScrollToPosition() кажется более надежным, возможно потому, что он по определению изменяет позицию списка с задержкой, делая гладкую прокрутку.

Посмотрите на этот пример исходного кода:

// Wee need to pospone the list move until all other view setup activities are finished 
list.post(new Runnable(){ 
    @override 
    public void run() { 
     list.setSelectionFromTop(selectedPosition, Math.max(0, Math.round(list.getHeight()/3))); // Make sure selection is in middle of page, if possible. 
     // Make sure you do not modify (this or other) parts of the view afterwards - it may break the list move 
     // activityButtons.setVisibility(View.GONE); 
}}); 
0

попробовать этот

sc.post(new Runnable() { 
     public void run() { 
      sc.smoothScrollTo(x, y); 
     } 
    }); 

х позиции, где прокручивать по оси X

у позиции, где прокрутки на Y ось

2

Я думаю, что это должно быть достаточно хорошим:

yourButtonView.getParent().requestChildFocus(yourButtonView,yourButtonView); 

общественного недействительный RequestChildFocus (Посмотреть ребенок Посмотреть внимание)

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

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

0

Используйте этот код, взятый из this answer

private final void focusOnView(){ 
     new Handler().post(new Runnable() { 
      @Override 
      public void run() { 
       your_scrollview.scrollTo(0, your_EditBox.getBottom()); 
      } 
     }); 
    } 
Смежные вопросы