如何使左侧出现“滚动条”?

在Android ListView ,如何让scrollbar出现在左侧?

Solutions Collecting From Web of "如何使左侧出现“滚动条”?"

例:

 mView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT); 

您可以使用View.SCROLLBAR_​​POSITION_LEFT将滚动条位置向左移动 。

正如另外两个答案所提到的,一种可能性是使用View.setVerticalScrollbarPosition()和SCROLLBAR_​​POSITION_LEFT 。 然而,一个巨大的警告是,这需要API等级11+,在写入时间占Android安装不到10%。 对于大多数应用程序,这是不可接受的。

想到在老版本的Android上实现你想要的东西的一种可能性就是做一些非常糟糕的事情:closures滚动条,用一个狭窄的布局镜像你的主布局,左边的宽度足够宽,以适应滚动条,当你的主视图滚动时(通过覆盖onScrollChanged() ),用scrollyBy()手动滚动左边的视图。

也就是说,除非有非常令人信服的理由将滚动条移动到左侧,否则我不会推荐它。 在大多数情况下,只要让Android遵循其默认设置,就可以让自己的应用适应设备上其他应用的行为。

试试我的黑客,似乎至less在2.2及以上的工作。

 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); } }