2013-04-18 25 views
7

Używam HorizontalScrollView w ramach Fragment. Kiedy przewijam ten widok zamiast przewijać elementy w obrębie HorizontalScrollView, cały fragment jest przewijany w lewo lub w prawo. Teraz pomyślałem o użyciu przycisków po obu stronach układu. Ale nie mogę uzyskać, jak przewijać widok przewijania po obu stronach.Przewijanie HorizontalScrollView przez klikanie przycisków po bokach

Każda pomoc w tym zakresie będzie bardzo ceniona.

EDIT

Poniżej mój plik xml.

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

<ImageButton 
    android:id="@+id/btn_left" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:src="@drawable/left_arrow" /> 

<ImageButton 
    android:id="@+id/btn_right" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:src="@drawable/right_arrow" /> 

<HorizontalScrollView 
    android:id="@+id/horizontal_scrollview" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_toLeftOf="@id/btn_right" 
    android:layout_toRightOf="@id/btn_left" 
    android:fadeScrollbars="false" 
    android:padding="5dp" 
    android:scrollbarAlwaysDrawHorizontalTrack="true" 
    android:scrollbars="horizontal" > 

    <LinearLayout 
     android:id="@+id/dynamic_generation" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 
    </LinearLayout> 
</HorizontalScrollView> 

i mój plik java

public class MyGallery extends Activity { 

private LinearLayout linearLayout; 

private ImageButton leftBtn; 
private ImageButton rightBtn; 
private HorizontalScrollView hsv; 
int currentScrollX = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.horizontalscrolling); 

    leftBtn = (ImageButton) findViewById(R.id.btn_left); 
    rightBtn = (ImageButton) findViewById(R.id.btn_right); 
    hsv = (HorizontalScrollView) findViewById(R.id.horizontal_scrollview); 
    linearLayout = (LinearLayout) findViewById(R.id.dynamic_generation); 

    leftBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
     } 
    }); 

    rightBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
     } 
    }); 

    String[] users = new String[20]; 
    for (int i = 0; i < 20; i++) { 
     users[i] = "user " + (i + 1); 
    } 

    for (int i = 0; i < users.length; i++) { 
     final TextView userId = new TextView(MyGallery.this); 
     userId.setText(users[i]); 
     ImageView imageView = new ImageView(MyGallery.this); 
     linearLayout.addView(userId); 
     linearLayout.addView(imageView); 
     userId.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(MyGallery.this, 
         userId.getText() + " has been clicked!", 
         Toast.LENGTH_LONG).show(); 
       // hsv. 
      } 
     }); 
    } 
} 

} 

Co muszę

Po naciśnięciu któregokolwiek z lewego lub prawego przycisku przewijania widoku musi przewijać w lewo lub w prawo, odpowiednio .

+0

Czy umieścisz swój xml? – Catherine

+0

@ Catherine zobacz moje edytowane pytanie. –

Odpowiedz

9

Jeśli dodać następujący wiersz kodu do istniejącej obsługi, Pana zdaniem, będzie przewiń w prawo z każdym z przycisków:

rightBtn.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     hsv.scrollTo((int)hsv.getScrollX() + 10, (int)hsv.getScrollY()); 
    } 
}); 

Jeśli chcesz go przewijać płynnie można użyć zamiast onTouchListener :

rightBtn.setOnTouchListener(new View.OnTouchListener() { 

    private Handler mHandler; 
    private long mInitialDelay = 300; 
    private long mRepeatDelay = 100; 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       if (mHandler != null) 
        return true; 
       mHandler = new Handler(); 
       mHandler.postDelayed(mAction, mInitialDelay); 
       break; 
      case MotionEvent.ACTION_UP: 
       if (mHandler == null) 
        return true; 
       mHandler.removeCallbacks(mAction); 
       mHandler = null; 
       break; 
     } 
     return false; 
    } 

    Runnable mAction = new Runnable() { 
     @Override 
     public void run() { 
      hsv.scrollTo((int) hsv.getScrollX() + 10, (int) hsv.getScrollY()); 
      mHandler.postDelayed(mAction, mRepeatDelay); 
     } 
    }; 
}); 

Zmieniaj opóźnienia zgodnie z własnymi upodobaniami, aby uzyskać płynność i szybkość reakcji.

+0

Co przez to rozumiesz? – Catherine

+0

jak można było przewinąć w lewo ... jak zmienić pozycję w lewym pasku Nie mogę przewinąć w lewo? – nitesh

+0

Również hsv.getScrollX() podaje tylko lewą krawędź – nitesh