studio programacion herramientas fundamentos con avanzado aplicaciones android android-listview android-scrollview android-scrollbar

android - programacion - ¿Cómo hacer que la `barra de desplazamiento` aparezca en el lado izquierdo?



manual de android en pdf (4)

Como las otras dos respuestas han mencionado, una posibilidad es usar View.setVerticalScrollbarPosition() con View.SCROLLBAR_POSITION_LEFT . Sin embargo, una advertencia importante es que esto requiere API nivel 11+, que al momento de escribir representa menos del 10% de las instalaciones de Android. Para la mayoría de las aplicaciones, eso no es aceptable.

Una posibilidad que viene a la mente para lograr lo que quieres en versiones anteriores de Android sería hacer algo muy complicado: apaga la barra de desplazamiento, refleja tu diseño principal con un diseño estrecho a la izquierda, lo suficientemente ancho como para caber barra de desplazamiento, y desplaza manualmente la vista izquierda con scrollyBy() medida que se desplaza la vista principal (anulando onScrollChanged() ).

Dicho esto, en realidad no lo recomendaría a menos que haya una razón muy convincente para mover la barra de desplazamiento hacia la izquierda. En la mayoría de los casos, desea que su aplicación se adapte y se comporte como cualquier otra aplicación en el dispositivo simplemente dejando que Android siga sus valores predeterminados.

En un ListView Android, ¿cómo puedo hacer que la scrollbar aparezca en el lado izquierdo?


Prueba mi truco, parece funcionar al menos en 2.2 y superior.

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



ejemplo:

mView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT);