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