[英]Android viewpager2 tab layout with FragmentStateAdapter
[英]Android Activity recreation front ViewPager2 layout measurements
我的活動在其布局中包含 ViewPager2。
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="ru.telemonitor.signal.r2d2.multimeter.imsat.Fragments.Dialogs.CalibrateActivity">
...
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintTop_toBottomOf="@+id/calibrate_result"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/calibrate_steps_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center"
android:layout_margin="10dp"
/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/calibrate_steps_tab_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
app:tabBackground="@drawable/tab_indicator_selector"
app:tabGravity="center"
app:tabIndicatorHeight="0dp"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
這就是 ViewPager2 初始化的方式。 請注意,CalibrateProbesFragment 的高度與其他高度不同。
private inner class CalibrateActivityPagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
override fun getItemCount(): Int = 4
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> CalibrateProbesFragment()
1 -> CalibrateVoltageFragment()
2 -> CalibrateCurrentFragment()
3 -> CalibrateResistanceFragment()
else -> Fragment()
}
}
}
當活動由 Intent 創建時,會有正確的高度測量。
之后,我嘗試在通過 startActivityForResult 調用其他活動后在其 onActivityResult 方法中重新創建活動。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val unmaskedRequestCode = requestCode and 0x0000ffff
if (unmaskedRequestCode == ImsatActivity.PICK_DEVICE_REQUEST) {
if (resultCode == RESULT_OK) {
data?.let { data ->
val index = data.getIntExtra(DiscoverActivity.DEVICE_INDEX, -1)
if (index < 0) {
super.onBackPressed()
return
}
val available = AppController.getInstance().dataProviderService.discoveredDevices
if (available.size == 0) {
Toast.makeText(this, "Error: try reconnect", Toast.LENGTH_LONG).show()
super.onBackPressed()
return
}
if (available.size < index) {
super.onBackPressed()
return
}
val multimeterDevice = available[index]
val name = data.getStringExtra(DiscoverActivity.DEVICE_NAME)
if (name == null || name == "" || name != multimeterDevice.name) {
super.onBackPressed()
return
}
AppController.getInstance().dataProviderService.tryConnectDevice(multimeterDevice)
viewPager.setCurrentItem(0, false)
restart()
}
}
}
}
private fun restart () {
// startActivity(Intent.makeRestartActivityTask(this.intent?.component))
recreate()
}
正如您所注意到的,我在 recreate() 之前調用了 viewPager.setCurrentItem(0, false)。 活動重置后,viewpager 中的所有片段與第一個片段具有相同的高度(在索引 0 處)。
我使用重新創建是因為我希望活動位於后退導航隊列中的同一點,但完全重新創建其視圖。 主要是因為這似乎是更少的代碼解決方案。 如果可以使用標准的 Activity 方法,我真的不想為自定義娛樂編寫 100 多行。 也許有一些解決方法? 謝謝你。
我不知道如何解決這個問題。 我剛剛通過 Intent 開始了一項新活動。
private fun restart () {
// startActivity(Intent.makeRestartActivityTask(this.intent?.component))
// recreate()
val intent = Intent(this, CalibrateActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
finish()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.