Android: пользовательский класс для установки максимальной высоты NestedScrollView не работает (полоса прокрутки отсутствует) - PullRequest
7 голосов
/ 14 января 2020

Я создаю собственный класс для установки максимальной высоты NestedScrollView, основываясь на ответе, приведенном в этом вопросе StackOverflow:

Как установить максимальную высоту для NestedScrollView в Android?

Однако, когда я включаю пользовательский класс (MaxHeightNestedScrollView) в мой activity_main.xml макет кода, полоса прокрутки не появляется *1011*, когда TextView внутри MaxHeightNestedScrollView превышает установленную максимальную высоту. Ниже приведен код для MaxNestedScrollView:

import android.content.Context;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.widget.NestedScrollView;

public class MaxHeightNestedScrollView extends NestedScrollView {

    private int maxHeight = -1;

    public MaxHeightNestedScrollView(@NonNull Context context) {
        super(context);
    }

    public MaxHeightNestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MaxHeightNestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public int getMaxHeight() {
        return maxHeight;
    }

    public void setMaxHeight(int maxHeight) {
        this.maxHeight = maxHeight;
    }

    public void setMaxHeightDensity(int dps){
        this.maxHeight = (int)(dps * getContext().getResources().getDisplayMetrics().density);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (maxHeight > 0) {
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

Ниже приведен код для файла attrs.xml в папке values:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MaxHeightNestedScrollView">
        <attr name="maxHeight" format="dimension" />
    </declare-styleable>
</resources>

Ниже приведен код для activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:layout_weight="1"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Lorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
\nLorem ipsum\nLorem ipsum\nLorem ipsum" />

            <com.example.testgradle.MaxHeightNestedScrollView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                app:maxHeight="130dp">
                <TextView
                    android:id="@+id/textView2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textSize="20dp"
                    android:textColor="#000000"
                    android:text="Lorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
\nLorem ipsum\nLorem ipsum\nLorem ipsumLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
\nLorem ipsum\nLorem ipsum\nLorem ipsum" />
            </com.example.testgradle.MaxHeightNestedScrollView>

            <TextView
                android:id="@+id/textView3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Lorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
\nLorem ipsum\nLorem ipsum\nLorem ipsum" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

Ответы [ 2 ]

5 голосов
/ 16 января 2020

Ваш MaxHeightNestedScrollView является неполным, так как не указывает, как использовать атрибут maxHeight из xml. Используйте ниже модифицированный MaxHeightNestedScrollView класс (разница закомментирована).

MaxHeightNestedScrollView. java

public class MaxHeightNestedScrollView extends NestedScrollView {

private int maxHeight = -1;

public MaxHeightNestedScrollView(@NonNull Context context) {
    this(context, null, 0); // Modified changes
}

public MaxHeightNestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0); // Modified changes
}

public MaxHeightNestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs, defStyleAttr); // Modified changes
}

 // Modified changes
private void init(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr){
    final TypedArray a = context.obtainStyledAttributes(
            attrs, R.styleable.MaxHeightNestedScrollView, defStyleAttr, 0);
    maxHeight = 
    a.getDimensionPixelSize(R.styleable.MaxHeightNestedScrollView_maxHeight, 0);
    a.recycle();
}

public int getMaxHeight() {
    return maxHeight;
}

public void setMaxHeight(int maxHeight) {
    this.maxHeight = maxHeight;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (maxHeight > 0) {
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}


Также, чтобы отобразить полосу прокрутки в NestingScrollView, просто добавьте атрибут android:scrollbars="vertical" в ваше представление MaxHeightNestedScrollView в xml.
После изменений ваш файл макета будет выглядеть следующим образом.

activity_main. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:layout_weight="1"
    android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Lorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
            \nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem 
            ipsum\nLorem ipsum
            \nLorem ipsum\nLorem ipsum\nLorem ipsum" />

        <com.example.testgradle.MaxHeightNestedScrollView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical" // Modified changes
            app:maxHeight="130dp">
            <TextView
                android:id="@+id/textView2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="20dp"
                android:textColor="#000000"
                android:text="Lorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
                \nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
                \nLorem ipsum\nLorem ipsum\nLorem ipsumLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
                \nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
                \nLorem ipsum\nLorem ipsum\nLorem ipsum" />
        </com.example.testgradle.MaxHeightNestedScrollView>

        <TextView
            android:id="@+id/textView3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Lorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
            \nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum\nLorem ipsum
            \nLorem ipsum\nLorem ipsum\nLorem ipsum" />
    </LinearLayout>
</ScrollView>
</LinearLayout>

Надеюсь, что эта справка.

0 голосов
/ 16 января 2020

Вы переносите высоту в wrap_content вашего пользовательского scrollView

<com.example.testgradle.MaxHeightNestedScrollView
            android:layout_width="match_parent"
            android:layout_height="provide your desired height"
            android:scrollbars="vertical"
            android:fadeScrollbars="false">
...