Bên trong một ScrollView tôi đang chuyển đổi linh hoạt giữa hai mảnh với độ cao khác nhau. Thật không may dẫn đến nhảy. Người ta có thể thấy nó trong hình ảnh động sau:
- Tôi đang cuộn xuống cho đến khi chạm vào nút "hiển thị màu vàng".
- Nhấn "hiển thị màu vàng" thay thế một mảnh màu xanh khổng lồ bằng một mảnh màu vàng nhỏ. Khi điều này xảy ra, cả hai nút nhảy xuống cuối màn hình.
Tôi muốn cả hai nút ở cùng một vị trí khi chuyển sang đoạn màu vàng. Làm thế nào có thể được thực hiện?
Mã nguồn có sẵn tại https://github.com/wondering639/stack-dynamiccontent tương ứng https://github.com/wondering639/stack-dynamiccontent.git
Đoạn mã có liên quan:
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView 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/myScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="800dp"
android:background="@color/colorAccent"
android:text="@string/long_text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button_fragment1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:text="show blue"
app:layout_constraintEnd_toStartOf="@+id/button_fragment2"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<Button
android:id="@+id/button_fragment2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:text="show yellow"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/button_fragment1"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/button_fragment2">
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
ChínhActivity.kt
package com.example.dynamiccontent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// onClick handlers
findViewById<Button>(R.id.button_fragment1).setOnClickListener {
insertBlueFragment()
}
findViewById<Button>(R.id.button_fragment2).setOnClickListener {
insertYellowFragment()
}
// by default show the blue fragment
insertBlueFragment()
}
private fun insertYellowFragment() {
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.fragment_container, YellowFragment())
transaction.commit()
}
private fun insertBlueFragment() {
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.fragment_container, BlueFragment())
transaction.commit()
}
}
Fragment_blue.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="400dp"
android:background="#0000ff"
tools:context=".BlueFragment" />
Fragment_yellow.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="#ffff00"
tools:context=".YellowFragment" />
DẤU
Xin lưu ý rằng đây tất nhiên là một ví dụ hoạt động tối thiểu để thể hiện vấn đề của tôi. Trong dự án thực sự của tôi, tôi cũng có quan điểm bên dưới @+id/fragment_container
. Vì vậy, đưa ra một kích thước cố định @+id/fragment_container
không phải là một lựa chọn cho tôi - nó sẽ gây ra một vùng trống lớn khi chuyển sang đoạn thấp, màu vàng.
CẬP NHẬT: Tổng quan về các giải pháp được đề xuất
Tôi đã thực hiện các giải pháp đề xuất cho mục đích thử nghiệm và thêm kinh nghiệm cá nhân của tôi với chúng.
câu trả lời của Cheticamp, https://stackoverflow.com/a/60323255
-> có sẵn trong https://github.com/wondering639/stack-dynamiccontent/tree/60323255
-> FrameLayout kết thúc nội dung, mã ngắn
trả lời bởi Pavneet_Singh, https://stackoverflow.com/a/60 310807
-> có sẵn trong https://github.com/wondering639/stack-dynamiccontent/tree/60310807
-> FrameLayout có kích thước của mảnh màu xanh. Vì vậy, không có nội dung gói. Khi chuyển sang đoạn màu vàng, có một khoảng cách giữa nó và nội dung theo sau nó (nếu có bất kỳ nội dung nào theo sau nó). Không có kết xuất bổ sung mặc dù! ** cập nhật ** một phiên bản thứ hai đã được cung cấp cho thấy cách thực hiện mà không có khoảng trống. Kiểm tra các ý kiến để trả lời.
câu trả lời của Ben P., https://stackoverflow.com/a/60251036
-> có sẵn trong https://github.com/wondering639/stack-dynamiccontent/tree/60251036
-> FrameLayout kết thúc tốt đẹp nội dung. Mã nhiều hơn giải pháp của Cheticamp. Chạm vào nút "hiển thị màu vàng" hai lần dẫn đến "lỗi" (các nút nhảy xuống phía dưới, thực sự là vấn đề ban đầu của tôi). Người ta có thể tranh luận về việc chỉ vô hiệu hóa nút "hiển thị màu vàng" sau khi chuyển sang nút này, vì vậy tôi sẽ không coi đây là vấn đề thực sự.