Android Fragment在按下后退按钮时未保存UI状态



我的用例遇到了一个问题。它是非常基本的用例。我有一个主要活动和2个片段。主活动没有太多UI。它所做的只是用FirstFragment替换容器。

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, FirstFragment.newInstance())
.addToBackStack(null)
.commit()
}
}

FirstFragment有两个按钮-initializeButton和button1,默认情况下initializeBbutton处于启用状态,而button1只有在按下initializeBButton后才能启用。initializeButton之后,一旦按下Button1,就会启动SecondFragment。以下是执行此操作的代码。

requireActivity().supportFragmentManager.beginTransaction()
.replace(R.id.container, SecondFragment.newInstance())
.addToBackStack(null)
.commit()

现在,这将正确地启动Secondfragment。现在,当我在Fragment2中按下后退按钮时,我想要的行为是在两个按钮都处于启用状态的情况下启动第一个片段。相反,它将在First Fragment中进入默认状态(initialize按钮处于Enabled状态,button1处于Disabled状态(。感谢任何反馈。感谢

主要活动

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, FirstFragment.newInstance())
.addToBackStack(null)
.commit()
}
}
}

主活动布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" />

FirstFragment

class FirstFragment : Fragment() {
companion object {
fun newInstance() = FirstFragment()
}
private lateinit var viewModel: SharedViewModel
private lateinit var initializeButton: Button
private lateinit var button1: Button
private lateinit var newview: View
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
if (savedInstanceState == null) {
newview = inflater.inflate(R.layout.fragment_first, container, false)
}
return  newview
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initializeButton = view.findViewById(R.id.button1)
initializeButton.setOnClickListener{
button1.isEnabled = true
}
button1 = view.findViewById(R.id.button2)
button1.setOnClickListener{
requireActivity().supportFragmentManager.beginTransaction()
.replace(R.id.container, SecondFragment.newInstance())
.addToBackStack(null)
.commit()
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean("initState", initializeButton.isEnabled)
outState.putBoolean("button1State", button1.isEnabled)
}
override fun onViewStateRestored(savedInstanceState: Bundle?) {
super.onViewStateRestored(savedInstanceState)
if (savedInstanceState != null) {
initializeButton.isEnabled = savedInstanceState.getBoolean("initState")
button1.isEnabled = savedInstanceState.getBoolean("button1State")
}
}

片段优先布局

<LinearLayout 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="wrap_content"
tools:context=".FirstFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="@string/initialize"
android:enabled="true"
android:layout_marginTop="5dp"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/button1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="@string/button2"
android:enabled="false"
android:layout_marginTop="5dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>

第二片段

class SecondFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_second, container, false)
}
companion object {
fun newInstance() = SecondFragment()
}
}

次碎片布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/second_fragment"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textStyle="bold"
android:visibility="visible"/>
<ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

替换片段有什么特殊的原因吗?如果没有,您可以简单地添加它,而不是替换它,这将确保状态得到维护。

你的代码会像这个一样变化

.add(R.id.container, SecondFragment.newInstance())
.addToBackStack(null)
.commit()

最新更新