2012-05-08 17 views
15

Próbuję ustawić pozycję poziomego przewijania tak, aby odpowiadał przyciskowi, który został naciśnięty. Próbowałem użyć tego, aby ustawić go bezskutecznie:Ustawienie pozycji Androida dla hortizontal scrollview

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

Nic nie daje, przewijanie pozostaje nienaruszone. 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> 

Więc jeśli 5th przycisk jest wciśnięty (co jest poza ekranem) kiedy nowa działalność, która rozpoczyna Chcę ustawić nowy widok tak pozioma Scrollview jest przesunięty w prawo w stosunku wychodząc całą drogę w lewo.

Jak ustawić pozycję poziomego przewijania?

Odpowiedz

31

W tej chwili próbujesz przewinąć do lewego górnego rogu HorizontalScrollView, a nie do pozycji przycisku. Spróbuj przewijanie do (x, y) położeniu przycisku tak:

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:

Ten kod nie będzie zachowywać się jak można się spodziewać, jeśli jest on umieszczony w onCreate(). Mimo że zadzwoniłeś pod numer setContentView(), układ nie został jeszcze zmierzony i zainicjowany. Oznacza to, że metody getLeft() i getTop(). Próba ustawienia pozycji przewijania, zanim układ zostanie w pełni zainicjalizowany, nie przyniesie efektu, więc musisz zadzwonić pod numer hsv.scrollTo() po pewnym czasie po onCreate().

Jedną z opcji, które wydaje się działać jest umieszczenie kodu w 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); 
} 

Jednak ta funkcja jest wywoływana za każdym razem zyski działalności lub traci ostrość, więc może skończyć się więcej często aktualizując pozycję przewijania niż zamierzałeś.

Bardziej eleganckim rozwiązaniem byłoby podklasy HorizontalScrollView i ustawienie pozycji przewijania w onMeasure(), po tym, jak wiesz, że widok został zainicjowany. Aby to zrobić, należy podzielić swój układ na dwa pliki i dodano nową klasę o nazwie 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()); 
    } 
} 

Kiedy MyHorizontalScrollView jest tworzony automatycznie powietrzne, i dodaje układ przycisków. Następnie po wywołaniu super onMeasure() (tak, aby wiedział, że układ zakończył inicjowanie), ustawia pozycję przewijania.

To jest nowy plik main.xml. Zawiera tylko nowy obiekt MyHorizontalScrollView, ale można go łatwo umieścić w układzie liniowym lub względnym i dodać inne elementy widoku. (Można by wymienić com.theisenp.test z nazwą pakietu, gdzie znajduje 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" /> 

A to przyciski.układ xml, który jest automatycznie napompowane przez 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

próbowałem to wprowadzenie onCreate prawej ustawić układ, ale nic się nie dzieje. Jakieś inne pomysły? – Nick

+0

Edytowałem swoją odpowiedź i dodałem pełne wyjaśnienie rozwiązania. – theisenp

+1

Geniusz! Dzięki za doskonałą odpowiedź. – Nick

6

Chociaż jest to stara sprawa, ja niedawno napotkasz ten sam problem i okazało się jeszcze inny, ale raczej mniej kompleksowe rozwiązanie.

Załóżmy dany plik układu w oryginalnym pytanie i załóżmy, że jeśli dana działalność jest uruchamiany z danym układzie, poziomo Scrollview musi być przewijane przycisku 5.

do Aby osiągnąć przewijania przycisk 5, aby, umieścić następujący kod w metodzie działania 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

To znacznie prostsze rozwiązanie. – lintmachine

Powiązane problemy