Если вы используете API 23+ (Android 6.0), используя следующие в целях прокрутки добавит верхние и нижние индикаторы.
android:scrollIndicators="top|bottom"
Если таргетинг старых API, я заглянула в оповещения Диалог исходного контроллера кода Google, и я использую следующий код:
private static void setScrollIndicators(ViewGroup root, final NestedScrollView content,
final int indicators, final int mask) {
// use it like this:
// setScrollIndicators(contentPanel, content, indicators,
// ViewCompat.SCROLL_INDICATOR_TOP | ViewCompat.SCROLL_INDICATOR_BOTTOM);
// Set up scroll indicators (if present).
View indicatorUp = root.findViewById(R.id.scrollIndicatorUp);
View indicatorDown = root.findViewById(R.id.scrollIndicatorDown);
if (Build.VERSION.SDK_INT >= 23) {
// We're on Marshmallow so can rely on the View APIsaa
ViewCompat.setScrollIndicators(content, indicators, mask);
// We can also remove the compat indicator views
if (indicatorUp != null) {
root.removeView(indicatorUp);
}
if (indicatorDown != null) {
root.removeView(indicatorDown);
}
} else {
// First, remove the indicator views if we're not set to use them
if (indicatorUp != null && (indicators & ViewCompat.SCROLL_INDICATOR_TOP) == 0) {
root.removeView(indicatorUp);
indicatorUp = null;
}
if (indicatorDown != null && (indicators & ViewCompat.SCROLL_INDICATOR_BOTTOM) == 0) {
root.removeView(indicatorDown);
indicatorDown = null;
}
if (indicatorUp != null || indicatorDown != null) {
final View top = indicatorUp;
final View bottom = indicatorDown;
if (content != null) {
// We're just showing the ScrollView, set up listener.
content.setOnScrollChangeListener(
new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX,
int scrollY,
int oldScrollX, int oldScrollY) {
manageScrollIndicators(v, top, bottom);
}
});
// Set up the indicators following layout.
content.post(new Runnable() {
@Override
public void run() {
manageScrollIndicators(content, top, bottom);
}
});
} else {
// We don't have any content to scroll, remove the indicators.
if (top != null) {
root.removeView(top);
}
if (bottom != null) {
root.removeView(bottom);
}
}
}
}
}
private static void manageScrollIndicators(View v, View upIndicator, View downIndicator) {
if (upIndicator != null) {
upIndicator.setVisibility(
ViewCompat.canScrollVertically(v, -1) ? View.VISIBLE : View.INVISIBLE);
}
if (downIndicator != null) {
downIndicator.setVisibility(
ViewCompat.canScrollVertically(v, 1) ? View.VISIBLE : View.INVISIBLE);
}
}
И XML выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:id="@+id/scrollIndicatorUp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dim_white"
android:visibility="gone"
tools:visibility="visible" />
<android.support.v4.widget.NestedScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<... you content here>
</android.support.v4.widget.NestedScrollView>
<View
android:id="@+id/scrollIndicatorDown"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dim_white"
android:visibility="gone"
tools:visibility="visible" />
</LinearLayout>
гм, а не действительно работает. Когда я добавляю View, как вы сказали, мне нужно добавить еще один LinearLayout вокруг ScrollView и нового элемента, потому что разрешен только один корневой элемент. Тогда линия появляется ТОЛЬКО, когда нет прокрутки. Как только содержимое больше видимого пространства, линия исчезает. Но я хотел, чтобы это было наоборот: только линия, когда есть прокрутка. – nyx
Возможно, вы могли бы использовать относительный макет, и тогда вы можете правильно расположить его. [См. Этот ответ] (http://stackoverflow.com/a/8271429/4428462). Чтобы показать это только при прокрутке, вы можете узнать, прокручивается ли ваш scrollView в вашем коде (попробуйте получить высоту содержимого и высоту scrollView и посмотреть, будет ли первое больше второго) и показать/скрыть представление горизонтальной полосы в зависимости от ситуации. – JonasCz
Хм, это не так просто ...Когда я использую RelativeLayout, мне нужно установить высоту в wrap_content. Высота ScrollView также является wrap_content. Теперь, когда я установил ScrollView layout_alignParentTop = "true" и для Line-View android: layout_alignParentBottom = "true", он работает для линии. Но теперь у меня есть проблема, что высота диалога всегда на максимуме, даже если есть мало контента. Если я использую android: layout_below = "@ id/scrollView" для Line-View, размер диалогового окна прав, но теперь строка появляется только тогда, когда нет прокрутки. Такое же поведение, как у LinearLayout. – nyx