2012-05-08 4 views
15

Я пытаюсь установить положение горизонтального прокрутки, чтобы оно соответствовало нажатой кнопке. Я пытался использовать это, чтобы установить его неудачно:Положение установки Android горизонтального прокрутки

HorizontalScrollView hsv = (HorizontalScrollView)findViewById(R.id.ScrollView); 
int x, y; 
x = hsv.getLeft(); 
y = hsv.getTop(); 
hsv.scrollTo(x, y); 

В результате ничего, то Scrollview не влияет. XML-:

<HorizontalScrollView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/ScrollView" 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:layout_alignParentBottom="true" 
     android:background="@null" 
     android:scrollbars="none" > 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="horizontal" > 

      <Button 
       android:layout_width="100dp" 
       android:layout_height="fill_parent" 
       android:layout_marginBottom="-5dp" 
       android:text="btn0" 
       android:id="@+id/btn0" 
       android:background="@drawable/yellow_btn" /> 

      <Button 
       android:layout_width="100dp" 
       android:layout_height="fill_parent" 
       android:layout_marginBottom="-5dp" 
       android:background="@drawable/yellow_btn" 
       android:text="bnt1" 
       android:id="@+id/btn1" /> 

      <Button 
       android:layout_width="100dp" 
       android:layout_height="fill_parent" 
       android:layout_marginBottom="-5dp" 
       android:background="@drawable/yellow_btn" 
       android:text="btn2" 
       android:id="@+id/btn2" /> 

      <Button 
       android:layout_width="100dp" 
       android:layout_height="fill_parent" 
       android:layout_marginBottom="-5dp" 
       android:background="@drawable/yellow_btn" 
       android:text="btn3" 
       android:id="@+id/btn3" /> 

     <Button 
       android:layout_width="100dp" 
       android:layout_height="fill_parent" 
       android:layout_marginBottom="-5dp" 
       android:background="@drawable/yellow_btn" 
       android:text="btn4" 
       android:id="@+id/btn4" /> 

     <Button 
       android:layout_width="100dp" 
       android:layout_height="fill_parent" 
       android:layout_marginBottom="-5dp" 
       android:background="@drawable/yellow_btn" 
       android:text="btn5" 
       android:id="@+id/btn5" /> 

     </LinearLayout> 
    </HorizontalScrollView> 

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

Как установить положение горизонтального прокрутки?

ответ

31

Прямо сейчас вы пытаетесь прокрутить в верхний левый угол HorizontalScrollView, а не положение кнопки. Попробуйте прокрутки в положение (х, у) кнопки, как это:

HorizontalScrollView hsv = (HorizontalScrollView) findViewById(R.id.ScrollView); 
Button button = (Button) findViewById(R.id.btn5); 
int x, y; 
x = button.getLeft(); 
y = button.getTop(); 
hsv.scrollTo(x, y); 

EDIT:

Этот код не будет вести себя так, как можно было бы ожидать, если он будет помещен в onCreate(). Даже если вы вызвали setContentView(), макет еще не был измерен и еще не инициализирован. Это означает, что методы getLeft() и getTop()will both return 0. Попытка установить положение прокрутки до полной инициализации макета не имеет никакого эффекта, поэтому вам нужно позвонить hsv.scrollTo() через некоторое время после onCreate().

Один вариант, который, кажется, работает помещает код в onWindowFocusChanged():

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 

    HorizontalScrollView hsv = (HorizontalScrollView) findViewById(R.id.ScrollView); 
    Button button = (Button) findViewById(R.id.btn5); 
    int x, y; 
    x = button.getLeft(); 
    y = button.getTop(); 
    hsv.scrollTo(x, y); 
} 

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

Более элегантным решением было бы подкласс HorizontalScrollView и установить положение прокрутки в onMeasure(), после того как вы узнаете, что представление было инициализировано. Чтобы сделать это, я разделить ваш макет на два файла и добавлен новый класс с именем MyHorizontalScrollView:

package com.theisenp.test; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.HorizontalScrollView; 

public class MyHorizontalScrollView extends HorizontalScrollView { 

    public MyHorizontalScrollView(Context context) { 
     super(context); 
     addButtons(context); 
    } 

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

    /** 
    * Inflates the layout containing the buttons and adds them to the ScrollView 
    * @param context 
    */ 
    private void addButtons(Context context) { 
     View buttons = inflate(context, R.layout.buttons, null); 
     addView(buttons); 

    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     //Find button 5 and scroll to its location 
     View button = findViewById(R.id.btn5); 
     scrollTo(button.getLeft(), button.getTop()); 
    } 
} 

Когда MyHorizontalScrollView создан, он автоматически раздувает и добавляет расположение кнопок. Затем после вызова супер onMeasure() (чтобы он знал, что макет завершил инициализацию), он устанавливает положение прокрутки.

Это новый файл main.xml. Он содержит только новый MyHorizontalScrollView, хотя вы можете легко разместить его внутри линейного или относительного макета и добавить другие элементы представления. (Вы бы заменить com.theisenp.test с именем пакета, в котором MyHorizontalScrollView находится):

<?xml version="1.0" encoding="utf-8"?> 
<com.theisenp.test.MyHorizontalScrollView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/ScrollView" 
android:layout_width="fill_parent" 
android:layout_height="50dp" 
android:layout_alignParentBottom="true" 
android:background="@null" 
android:scrollbars="none" /> 

И это кнопка.XML-макет, который автоматически завышены MyHorizontalScrollView:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="fill_parent" 
android:orientation="horizontal" > 

    <Button 
    android:id="@+id/btn0" 
    android:layout_width="100dp" 
    android:layout_height="fill_parent" 
    android:layout_marginBottom="-5dp" 
    android:text="btn0" /> 

    <Button 
    android:id="@+id/btn1" 
    android:layout_width="100dp" 
    android:layout_height="fill_parent" 
    android:layout_marginBottom="-5dp" 
    android:text="bnt1" /> 

    <Button 
    android:id="@+id/btn2" 
    android:layout_width="100dp" 
    android:layout_height="fill_parent" 
    android:layout_marginBottom="-5dp" 
    android:text="btn2" /> 

    <Button 
    android:id="@+id/btn3" 
    android:layout_width="100dp" 
    android:layout_height="fill_parent" 
    android:layout_marginBottom="-5dp" 
    android:text="btn3" /> 

    <Button 
    android:id="@+id/btn4" 
    android:layout_width="100dp" 
    android:layout_height="fill_parent" 
    android:layout_marginBottom="-5dp" 
    android:text="btn4" /> 

    <Button 
    android:id="@+id/btn5" 
    android:layout_width="100dp" 
    android:layout_height="fill_parent" 
    android:layout_marginBottom="-5dp" 
    android:text="btn5" /> 

</LinearLayout> 
+0

Я попытался это положить в OnCreate справа после настройки макета, но ничего не происходит. Любые другие идеи? – Nick

+0

Я отредактировал свой ответ и добавил полное объяснение решения. – theisenp

+1

Гений! Спасибо за отличный ответ. – Nick

6

Хотя, это старый вопрос, я недавно столкнулся с такой же проблемой и нашел еще один, но гораздо менее сложное решение.

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

Для достижения прокрутки кнопки 5, поместите следующий код в onCreate() метод деятельности:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Some code such as layout inflation. 

     final HorizontalScrollView hsv = (HorizontalScrollView) findViewById(R.id.ScrollView); 

     // Scrolling to button 5. 
     hsv.post(new Runnable() { 
      @Override 
      public void run() { 
       // Get the button. 
       View button = findViewById(R.id.btn5); 

       // Locate the button. 
       int x, y; 
       x = button.getLeft(); 
       y = button.getTop(); 

       // Scroll to the button. 
       hsv.scrollTo(x, y); 
      } 
     }); 
    } 
} 
+0

Это гораздо более простое решение. – lintmachine