Прокрутка NestedScrollView, когда пользовательский вид меняет свои размеры - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть макет с кнопкой и пользовательский вид. Пользовательское представление имеет макет с текстовым представлением, видимым по умолчанию, и еще одно текстовое представление, которое пропало (это похоже на представление с вопросом и ответом, ответ виден, когда пользователь нажимает на него - расширяемое представление). Мне нужно такое поведение: при нажатии на кнопку, второй вид текста стал видимым (вид расширен) и прокрутка родительского макета, чтобы все пользовательское представление стало видимым на экране. Но на самом деле экран прокручивается до текстового представления, которое было видно с самого начала, в то время как текстовое представление с ответом оставалось вне видимого пространства экрана. Обратите внимание, что я показываю минимальную версию кода, реальная компоновка фрагмента имеет больше других представлений, поэтому прокрутка действительно необходима. Может кто-нибудь понять, что я делаю не так? Спасибо за внимание.

Вызов requestLayout () и invalidate () не решает проблему.

class ExpandableQuestionView : ConstraintLayout{

    private var isViewExpanded: Boolean = false
    private var questionTitle: String = ""
    private var questionMessage: String = ""

    constructor(context: Context) : super(context) {
        initializeViews(null)
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        initializeViews(attrs)
    }

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr) {
        initializeViews(attrs)
    }

    private fun initializeViews(attrs: AttributeSet?) {
        val inflater = 
            context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        inflater.inflate(R.layout.view_expandable_question, this)

        val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ExpandableQuestionView)

        isViewExpanded = typedArray.getBoolean(R.styleable.ExpandableQuestionView_isViewExpanded, false)
        questionTitle = typedArray.getString(R.styleable.ExpandableQuestionView_question_title)?: ""
        questionMessage = typedArray.getString(R.styleable.ExpandableQuestionView_question_message)?: ""

        typedArray.recycle()

        question_title.text = questionTitle
        question_message.text = questionMessage
    }

    fun onClick() {
        if (isViewExpanded) collapseView() else expandView()
    }

    fun expandView() {
        isViewExpanded = true
        question_title.isVisible = true
        question_message.isVisible = true
        question_image.background = ContextCompat.getDrawable(context, R.drawable.remove)
        requestLayout()
        //invalidate()
    }

    private fun collapseView() {
        isViewExpanded = false
        question_title.isVisible = true
        question_message.isVisible = false
        question_image.background = ContextCompat.getDrawable(context, R.drawable.add)
        requestLayout()
        //invalidate()
    }
}

view_expandable_question макет:

<merge 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:id="@+id/expandable_question_container"
       android:layout_height="match_parent"
       android:layout_width="match_parent"
     tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">

    <TextView
        android:id="@+id/question_title"
        style="@style/GreenTitleStyle"
        android:gravity="start"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="16dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/padding_guideline"
        app:layout_constraintBottom_toTopOf="@+id/question_message"
        app:layout_constraintTop_toTopOf="parent"/>

    <ImageView
        android:id="@+id/question_image"
        android:layout_width="20dp"
        android:layout_height="20dp"
        app:layout_constraintTop_toTopOf="@id/question_title"
        app:layout_constraintBottom_toBottomOf="@id/question_title"
        app:layout_constraintEnd_toEndOf="parent"
        android:background="@drawable/add"/>

    <TextView
        android:id="@+id/question_message"
        style="@style/BlackTitleStyle"
        android:gravity="start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:layout_marginEnd="40dp"
        android:layout_marginBottom="16dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/padding_guideline"
        app:layout_constraintTop_toBottomOf="@id/question_title"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/padding_guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.9"/>

</merge>

макет фрагмента:

<androidx.core.widget.NestedScrollView
        android:id="@+id/transaction_detail_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <com.company.ui.internal.ExpandableQuestionView
            android:id="@+id/question"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            app:question_title="calculate_cashback_question_title"
            app:question_message="calculate_cashback_question_message"
            app:isViewExpanded="false"/>

    </LinearLayout>

</androidx.core.widget.NestedScrollView>

мой фрагмент:

class TransactionDetailedFragment {

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        button.setOnClickListener {
            question.expandView()
            transaction_detail_container.requestLayout()
            //transaction_detail_container.invalidate()
            val location = IntArray(2)
            question.getLocationOnScreen(location)
            val y = location[1]
            scrollScreen(y /*transaction_detail_container.bottom*/)
        }
    }

    private fun scrollScreen(y: Int) {
        transaction_detail_container.smoothScrollTo(0, y)
   }
}
...