cevap

46

örnek: Diğer iki cevap olarak

mView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT); 
+26

o xml aracılığıyla da mümkündür: android: verticalScrollbarPosition = –

+0

Ne yazık ki ([NavigationView] çalışmayan "sol" http://developer.android.com/intl/ru/reference/android/support/design/ widget/NavigationView.html) (API 23). – Luten

3

bir olasılık SCROLLBAR_POSITION_LEFT ile View.setVerticalScrollbarPosition() kullanarak, belirtmiştik. Bununla birlikte, bir dev uyarı, bu, Android kurulumlarının% 10'undan daha azını yazarken, API düzeyi 11+ gerektirir. Çoğu uygulama için bu kabul edilemez.

Android'in eski sürümlerinde ne yapmak istediğinizi aklınıza getiren bir olasılık çok kludgy yapmaktır: kaydırma çubuğunu kapatın, ana düzeninizi solunun dar bir düzeni ile yansıtın, sadece geniş Kaydırma çubuğuna sığacak kadar yeterlidir ve ana görünümde gezinirken sol görüntüyü scrollyBy() ile elle kaydırın ( onScrollChanged()'u geçersiz kılarak).

Bu, aslında kaydırma çubuğunu sola hareket ettirmek için çok zorlayıcı bir neden olmadığı sürece bunu önermemeyi söylemez. Çoğu durumda, uygulamanızın Android'deki varsayılanlarını takip etmesine izin vererek cihazdaki diğer uygulamalarda olduğu gibi davranmasını ve davranmasını istersiniz.

1

Hack'imi deneyin, en az 2.2 ve üstünde çalışıyor gibi görünüyor.

import java.lang.reflect.Field; 

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.graphics.Rect; 
import android.graphics.drawable.Drawable; 
import android.graphics.drawable.LayerDrawable; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 
import android.widget.ListView; 

/** 
* This class fixes the lack of setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT) before API level 11 
* @author Genadz Batsyan 
*/ 

public class ListViewWithLeftScrollBar extends ListView { 
    private static final String LOG_TAG = ListViewWithLeftScrollBar.class.getSimpleName(); 
    private static final boolean DEBUG = true; 

    private boolean patchInvalidate; 

    public ListViewWithLeftScrollBar(Context context) { 
     super(context); 
     moveVerticalScrollbarToTheLeft(); 
    } 

    public ListViewWithLeftScrollBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     moveVerticalScrollbarToTheLeft(); 
    } 

    public ListViewWithLeftScrollBar(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     moveVerticalScrollbarToTheLeft(); 
    } 

    @Override 
    public void invalidate(Rect r) { 
     invalidate(r.left, r.top, r.right, r.bottom); 
    } 

    @Override 
    public void invalidate(int left, int top, int right, int bottom) { 
     int width = right - left; 
     if (DEBUG) log("invalidate original w:"+ getWidth() +" h:"+ getHeight()+" rect:"+left+", "+top+", "+right+", "+bottom); 
     if (patchInvalidate && right == getWidth() && top == 0 && bottom == getHeight() && width < 30) { 
      // The above condition should ensure that ListView is VERY likely to be invalidating the scrollbar. 
      // In fact ListView appears to not invalidate anything except the scrollbar, ever. 
      left = 0; 
      right = left + width; 
      if (DEBUG) log("invalidate patched w:"+ getWidth() +" h:"+ getHeight()+" rect:"+left+", "+top+", "+right+", "+bottom); 
     } 
     super.invalidate(left, top, right, bottom); 
    } 

    private void moveVerticalScrollbarToTheLeft() { 
     try { 
      if (DEBUG) log("moveVerticalScrollbarToTheLeft: Trying API Level >=11"); 
      tryApiLevel11(); 
      if (DEBUG) log("moveVerticalScrollbarToTheLeft: API Level >=11 success"); 
     } catch (Throwable t1) { 
      if (DEBUG) { 
       log("moveVerticalScrollbarToTheLeft: API Level >=11 FAILED"); 
       t1.printStackTrace(); 
      } 
      try { 
       if (DEBUG) log("moveVerticalScrollbarToTheLeft: Trying hack for API Level <11"); 
       tryApiLevelPre11(); 
       patchInvalidate = true; 
       if (DEBUG) log("moveVerticalScrollbarToTheLeft: API Level <11 hack success"); 
      } catch (Throwable t2) { 
       if (DEBUG) { 
        log("moveVerticalScrollbarToTheLeft: API Level <11 hack FAILED"); 
        t2.printStackTrace(); 
       } 
      } 
     } 
    } 

    @SuppressLint("NewApi") 
    private void tryApiLevel11() { 
     setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT); 
    } 

    private void tryApiLevelPre11() throws Exception { 
     Class<?> viewClass = View.class; 

     Field scrollCacheField = viewClass.getDeclaredField("mScrollCache"); 
     scrollCacheField.setAccessible(true); 
     Object scrollCache = scrollCacheField.get(this); 
     if (DEBUG) log("scrollCache: "+ scrollCache); 

     Field scrollBarField = scrollCache.getClass().getDeclaredField("scrollBar"); 
     scrollBarField.setAccessible(true); 
     Object scrollBar = scrollBarField.get(scrollCache); 
     if (DEBUG) log("scrollBar: "+ scrollBar); 

     Field verticalThumbField = scrollBar.getClass().getDeclaredField("mVerticalThumb"); 
     verticalThumbField.setAccessible(true); 
     Object verticalThumb = verticalThumbField.get(scrollBar); 
     if (DEBUG) log("verticalThumb: "+ verticalThumb); 

     Drawable verticalThumbDrawable = (Drawable) verticalThumb; 
     Drawable replacementVerticalThumbDrawable = new LayerDrawable(new Drawable[]{ verticalThumbDrawable }) { 
      @Override 
      public void setBounds(int left, int top, int right, int bottom) { 
       if (DEBUG) log("setBounds original: "+left+", "+top+", "+right+", "+bottom); 
       int width = right - left; 
       left = 0; 
       right = left + width; 
       if (DEBUG) log("setBounds patched: "+left+", "+top+", "+right+", "+bottom); 
       super.setBounds(left, top, right, bottom); 
      }  
     }; 
     verticalThumbField.set(scrollBar, replacementVerticalThumbDrawable); 
    } 

    private static void log(String msg) { 
     Log.d(LOG_TAG, msg); 
    } 
} 
+0

Bunu 2.2.1 denedim ve işe yaramadı. –

+0

"if (Build.VERSION.SDK_INT