ScrollViewの内部では、高さが異なる2つのフラグメントを動的に切り替えています。残念ながらそれはジャンプにつながります。次のアニメーションで確認できます。
- 「黄色を表示」ボタンに到達するまでスクロールダウンしています。
- 「黄色を表示」を押すと、巨大な青いフラグメントが小さな黄色のフラグメントに置き換えられます。これが発生すると、両方のボタンが画面の最後にジャンプします。
黄色のフラグメントに切り替えたときに、両方のボタンが同じ位置に留まるようにします。どうすればできますか?
https://github.com/wondering639/stack-dynamiccontentで入手可能なソースコードそれぞれhttps://github.com/wondering639/stack-dynamiccontent.git
関連するコードスニペット:
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>
MainActivity.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" />
ヒント
これはもちろん、私の問題を自慢するための最低限の実例です。私の実際のプロジェクトでは、の下にもビューがあります@+id/fragment_container
。したがって、固定サイズを指定すること@+id/fragment_container
は私にとってオプションではありません-低い黄色のフラグメントに切り替えると、大きな空白領域が発生します。
更新:提案されたソリューションの概要
私はテスト目的で提案されたソリューションを実装し、それらの個人的な経験を追加しました。
Cheticampによる回答、https: //stackoverflow.com/a/60323255
-> https://github.com/wondering639/stack-dynamiccontent/tree/60323255で利用可能
-> FrameLayoutはコンテンツ、短いコードをラップします
Pavneet_Singhによる回答、https: //stackoverflow.com/a/60310807
-> https://github.com/wondering639/stack-dynamiccontent/tree/60310807で利用可能
-> FrameLayoutは青いフラグメントのサイズを取得します。したがって、コンテンツの折り返しはありません。黄色のフラグメントに切り替えると、それと後続のコンテンツの間にギャップがあります(後続のコンテンツがある場合)。追加のレンダリングはありません!**更新**隙間なく実行する方法を示す2つ目のバージョンが提供されました。回答へのコメントを確認してください。
ベンPによる回答、https://stackoverflow.com/a/60251036
-> https://github.com/wondering639/stack-dynamiccontent/tree/60251036で利用可能
-> FrameLayoutはコンテンツをラップします。Cheticampによるソリューションよりも多くのコード。「黄色を表示」ボタンを2回タッチすると、「バグ」が表示されます(ボタンは一番下にジャンプしますが、実際には私の元の問題です)。切り替え後に「黄色を表示」ボタンを無効にするだけでよいのではないかと思うので、これは本当の問題ではないと思います。