2013-03-05 9 views
5

Wygląda na to, że nie można pobrać lub ustawić dowolną pozycję lub ilości przewijania w moim prosty układ:Get lokalizację dziecka w HorizontalScrollView i wskaż go

// 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 

Co chcę w moim MainActivity jest, aby uzyskać pozycję dowolny przycisk wewnątrz HorizontalScrollView i przewiń do tej pozycji. W tej chwili nie mogę uzyskać lewej wartości (zawsze jest 0) i jeśli spróbuję wykonać scrollTo, to po prostu nie, niezależnie od tego, jaka jest wartość x lub 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()); 
    } 
} 

Tak, jak powiedziałem, nie mogę dostać lewą pozycję dla mojego przycisku, a każdy z nich może przejść do jakiejś pozycji X w moim HorizontalScrollView. czy to możliwe?

Odpowiedz

11

(zawsze 0)

Należy pamiętać, że widoki nie mają wymiary w sposobie onCreate jak są one umieszczone na ekranie po onCreate zwrotnych zwrotów.

Co chcę w moim główną działalność jest zdobycie pozycji dowolnego przycisku wewnątrz HorizontalScrollView i przewiń do tej pozycji.

Wystarczy popatrzeć na poniższy kod (umieszczonego w metodzie 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); 
     } 

    }); 

również być ostrożnym z atrybutów używanych w układzie (mówię o tym, co może spowodować layout_gravity problemy, jeśli się nie mylę).

+0

Nie trzeba iteracyjne nad wszystkie poglądy dzieci i sumując ich szerokości, aby uzyskać wartość przewijania. Po prostu ustaw 'scrollTo = button3.getLeft()' – camelCaseCoder

2

Można to zrobić bezpośrednio jak:

scrollTo = button3.getLeft(); 
Powiązane problemy