ListView
のAndroidでは、左側にscrollbar
を表示させるにはどうすればよいですか?`scrollbar`を左側に表示させるには?
答えて
例:他の2つの答えとして
mView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT);
View.SCROLLBAR_POSITION_LEFTを使用して、任意のビューのスクロールバーの位置を左に移動できます。
は、一つの可能性はSCROLLBAR_POSITION_LEFTとView.setVerticalScrollbarPosition()を使用して、言及しています。しかし、巨大な注意点の1つは、APIレベル11+が必要であるということです。これは、Androidのインストールの10%未満を占めるアカウントの作成時に発生します。ほとんどのアプリケーションでは、それは受け入れられません。
Androidの旧バージョンでは、スクロールバーをオフにして、メインレイアウトを幅の狭いレイアウトでミラーリングするだけで非常にクルージングを行うことができますスクロールバーに収まるのに十分な大きさになり、メインビューがスクロールされるとscrollyBy()と表示されます( onScrollChanged()を上書きして)。
しかし、スクロールバーを左に動かすことが非常に魅力的な理由がない限り、実際にはお勧めできません。ほとんどの場合、Androidのデフォルト設定に従うだけで、アプリが他のアプリと同じようにフィットし、他のアプリと同じように動作するようにします。
私のハックを試してみてください。少なくとも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);
}
}
2.2.1で試したところ、うまくいきませんでした。 –
'if(Build.VERSION_CDK_INT
- 1. Drupal - 左側のバーにフォーラムを表示
- 2. 画面の左側に縦に表示されるアンドロイドタブ
- 3. phpmyadminでテーブルをインポートした後、左側のパネルに表示されません
- 4. WPFメニューがウィンドウの左側に表示されます
- 5. 水平メインメニューをクリックするとページの左側にサブメニューが表示されます;表示/非表示divエラー
- 6. DirectShow&.Net - イメージの左側にあるストライプがビットマップに表示されますか?
- 7. RelativeLayout ImageViewをイメージの左側に、もう1つをイメージビューの左側に表示します。
- 8. Ruby On RailsとBootstrapの左側にロゴが表示されているNavbar
- 9. ScrollledFormのGridLayoutにscrollBarが表示されない
- 10. Xcode4のドキュメントブラウザの左側にTOCのアウトラインを表示する方法は?
- 11. ターゲットの左側にerrorTip(エラーツールヒント)を表示する方法はありますか?
- 12. テーブルヘッドを上にせずに左に表示する
- 13. Win32ウィンドウメニューは、ウィンドウの上部を横切るのではなく、左側に表示されます
- 14. 画像を左側の代わりにテキストボックスの右側に表示する方法
- 15. Visual Studio 2008の左側に「ファイルウィンドウ」をどのように表示しますか?
- 16. DataTemplateをMenuItemに使用すると、左側に余分なスペースが表示されますか?
- 17. Jquery Toolsタブでは、左側にタブが縦に表示されます。誰か助けてくれますか?
- 18. iphoneアプリケーションのナビゲーションバーの左側にメールボタンを表示できますか?
- 19. UIImageViewの左側に狭い白線が表示されるのはなぜですか?
- 20. 左からインジケータボタンを削除し、UITableViewの右側に削除ボタンを表示するには?
- 21. 水平メインメニューをクリックすると、ページの左側にサブメニューが表示されます
- 22. Magento:左側のサイドバーにカテゴリの説明を表示するにはどうすればよいですか?
- 23. WordPressブロッククォートを右手の代わりにページの左側に表示させるにはどうすればよいですか?
- 24. セルの右側と2番目の左側の同じセルに2つの値を表示
- 25. 私のウェブサイトがモバイルブラウザで左側に表示されないのはなぜですか?
- 26. Android - 左上にプログレスバーを表示
- 27. C - fprintfとprintfの内側のループはスクリーンに表示されません
- 28. なぜ私のボックスは右側に表示されませんか?
- 29. ValaにGTK3 ScrollBarステッパーボタンをどのように表示しますか?
- 30. 隠しフォームが左下隅に表示される
これは、XML経由でも可能です:アンドロイド:verticalScrollbarPositionは= –
は悲しい[NavigationView](http://developer.android.com/intl/ru/reference/android/support/design/で働いていない "左"ウィジェット/ NavigationView.html)(API 23)。 – Luten