2013-03-05 11 views
5

Sembra che non posso ottenere o impostare qualsiasi posizione o importo scorrimento nel mio layout semplice:Prendi posizione bambino in HorizontalScrollView e scorrere ad esso

// Relative layout - main_layout 
<HorizontalScrollView 
    android:id="@+id/MenuScroll" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:fillViewport="true" 
    android:scrollbars="none" > 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="48dp" 
     android:orientation="horizontal" 
     android:layout_gravity="center" 
     android:padding="0dp" > 

     <Button 
      android:id="@+id/button1" 
      android:layout_width="150dp" 
      android:layout_height="fill_parent" /> 

     <Button 
      android:id="@+id/button2" 
      android:layout_width="150dp" 
      android:layout_height="fill_parent" /> 

     <Button 
      android:id="@+id/button3" 
      android:layout_width="150dp" 
      android:layout_height="fill_parent" /> 

     <Button 
      android:id="@+id/button4" 
      android:layout_width="150dp" 
      android:layout_height="fill_parent" /> 

     <Button 
      android:id="@+id/button5" 
      android:layout_width="150dp" 
      android:layout_height="fill_parent" /> 

    </LinearLayout> 
</HorizontalScrollView> 
// End of RelativeLayout - main_layout 

Quello che voglio nel mio MainActivity è quello di ottenere la posizione di qualsiasi pulsante all'interno di HorizontalScrollView e scorrere fino a quella posizione. Al momento non riesco a ottenere il valore di sinistra (è sempre 0) e se provo a il HorizontalScrollView non lo fa, indipendentemente da quale sia il valore di x o y.

// imports 
public class MainActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main_layout); 

     final Button button3 = (Button)findViewById(R.id.button3); 
     Rect rectf = new Rect(); 
     button3.getLocalVisibleRect(rectf); 
     Log.i("Left: ", String.valueOf(rectf.left)); // it is always 0 

     HorizontalScrollView MenuScroll = (HorizontalScrollView)findViewById(R.id.MenuScroll); 
     // Trying to scroll to X=100 but it doesn't 
     MenuScroll.scrollTo(100, MenuScroll.getBottom()); 
    } 
} 

Quindi, come ho detto, non posso ottenere la posizione di sinistra per il mio tasto e sia in grado di scorrere in una certa posizione X nel mio HorizontalScrollView. È possibile?

risposta

11

(è sempre 0)

Tenete presente che il punto di vista non hanno dimensioni nel metodo onCreate in cui sono collocati sullo schermo dopo le onCreate rendimenti di callback.

Quello che voglio nel mio MainActivity è quello di ottenere la posizione di ogni tasto all'interno del HorizontalScrollView e scorrere fino a quella posizione.

Date un'occhiata al codice qui sotto (collocato nel metodo onCreate):

final HorizontalScrollView MenuScroll = (HorizontalScrollView) findViewById(R.id.MenuScroll); 

    MenuScroll.post(new Runnable() { 

     @Override 
     public void run() { 
      final Button button3 = (Button) findViewById(R.id.button3); 
      int scrollTo = 0; 
      final int count = ((LinearLayout) MenuScroll.getChildAt(0)) 
        .getChildCount(); 
      for (int i = 0; i < count; i++) { 
       final View child = ((LinearLayout) MenuScroll.getChildAt(0)) 
         .getChildAt(i);     
       if (child != button3) { 
        scrollTo += child.getWidth(); 
       } else { 
        break; 
       } 
      } 
      MenuScroll.scrollTo(scrollTo, 0); 
     } 

    }); 

anche stare attenti con gli attributi che si utilizzano nel layout (mi riferisco al layout_gravity che potrebbe causare problemi se non mi sbaglio).

+0

Non c'è bisogno di iterare su tutti i punti di vista dei bambini e sommando la loro larghezza per ottenere il valore di scorrimento. Basta impostare 'scrollTo = button3.getLeft()' – camelCaseCoder

2

si può fare direttamente come:

scrollTo = button3.getLeft(); 
Problemi correlati