添加Fragment
的四个方法
commit()
:异步提交事务,如果在Activity
状态已经保存(比如用户按下了Home键)后调用该方法,会抛出IllegalStateException
异常
commitAllowingStateLoss()
:异步提交事务,即使在Activity
状态已经保存后调用也不会抛出异常,但是可能会导致状态丢失
commitNow()
:同步提交事务,如果在Activity
状态保存后调用仍然会抛出IllegalStateException
异常
commitNowAllowingStateLoss()
::同步提交事务,即使在Activity
状态已经保存后调用也不会抛出异常,但是可能会导致状态丢失
XML
文件
Activity
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_ll"
android:layout_width="300dp"
android:layout_height="300dp"
android:orientation="vertical"
android:background="@android:color/holo_red_light">
<LinearLayout
android:id="@+id/child_ll"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_alignParentBottom="true"
android:orientation="horizontal" />
</RelativeLayout>
Fragment
布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/inflate_ll"
android:layout_width="match_parent"
android:layout_height="200dp"
android:orientation="vertical"
android:background="@android:color/holo_blue_light">
<TextView
android:id="@+id/count_tv"
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
android:text="Hello inflate" />
<Button
android:id="@+id/add_btn"
android:text="add count"
android:layout_width="match_parent"
android:layout_height="100dp"/>
</LinearLayout>
Activity
和Fragment
代码
Fragment
代码
class MyFragment : Fragment() {
var addBtn : Button ?= null
var countTv : TextView ?= null
var contentView : View ?= null
var count = 0
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
contentView = inflater.inflate(R.layout.inflate_layout, container, false)
addBtn = contentView?.findViewById(R.id.add_btn)
countTv = contentView?.findViewById(R.id.count_tv)
addBtn?.setOnClickListener {
count++
countTv?.text = count.toString()
}
return contentView
}
}
Activity
代码
const val TAG = "Yang"
class MainActivity : AppCompatActivity() {
var transaction : FragmentTransaction? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i(TAG, "onCreate")
transaction = supportFragmentManager.beginTransaction()
onSaveInstanceState(savedInstanceState?: Bundle()) // 模拟手动进行Activity的状态保存
addFragment()
}
private fun addFragment() {
Log.e("yang", "addFragment")
// 异步提交
transaction?.replace(R.id.child_ll, MyFragment())?.commit()
transaction?.replace(R.id.child_ll, MyFragment())?.commitAllowingStateLoss()
// 异步提交
transaction?.replace(R.id.child_ll, MyFragment())?.commitNow()
transaction?.replace(R.id.child_ll, MyFragment())?.commitNowAllowingStateLoss()
}
override fun onStart() {
super.onStart()
Log.i(TAG, "onStart")
}
override fun onResume() {
super.onResume()
Log.i(TAG, "onResume")
}
override fun onPause() {
super.onPause()
Log.i(TAG, "onPause")
}
override fun onStop() {
super.onStop()
Log.i(TAG, "onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG, "onDestroy")
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
Log.i(TAG, "onSaveInstanceState")
}
}
// commit() 和 commitNow() 提交方式 log result
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
// commitAllowingStateLoss() 和 commitNowAllowingStateLoss() 正常添加 log result
2024-05-19 16:38:03.496 9113-9113 Yang I onCreate
2024-05-19 16:38:03.497 9113-9113 Yang I onSaveInstanceState
2024-05-19 16:38:03.497 9113-9113 yang E addFragment
2024-05-19 16:38:03.537 9113-9113 Yang I onStart
2024-05-19 16:38:03.540 9113-9113 Yang I onResume