UI fragment 与 fragment 管理器
创建Crime数据类(Crime.kt)
data class Crime(val id: UUID = UUID.randomUUID(), var title: String = "", var date: Date = Date(), var isSolved: Boolean = false)Data classes 参考网址
创建UI fragment
CriminalIntent Enter a title for the crime. Title Details Solved
class CrimeFragment : Fragment() { private lateinit var crime: Crime private lateinit var titleField: EditText private lateinit var dateButton: Button private lateinit var solvedCheckBox: CheckBox override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) crime = Crime() } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_crime, container, false) titleField = view.findViewById(R.id.crime_title) as EditText dateButton = view.findViewById(R.id.crime_date) as Button solvedCheckBox = view.findViewById(R.id.crime_solved) as CheckBox dateButton.apply { text = crime.date.toString() isEnabled = false } return view } override fun onStart() { super.onStart() val titleWatcher = object : TextWatcher { override fun beforeTextChanged( sequence: CharSequence?, start: Int, count: Int, after: Int ) { // This space intentionally left blank } override fun onTextChanged( sequence: CharSequence?, start: Int, before: Int, count: Int ) { crime.title = sequence.toString() } override fun afterTextChanged(sequence: Editable?) { // This one too } } titleField.addTextChangedListener(titleWatcher) solvedCheckBox.apply { setOnCheckedChangeListener { _, isChecked -> crime.isSolved = isChecked } } } }Fragment.onCreate(Bundle?)是公共函数,而Activity.onCreate(Bundle?)是受保护函 数。(如果没有可见性修饰符,那么Kotlin函数默认是公共的。)Fragment.onCreate(Bundle?)函 数及其他Fragment生命周期函数必须是公共函数,因为托管fragment的activity要调用它们。
托管UI fragment
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) if (currentFragment == null) { val fragment = CrimeFragment() supportFragmentManager .beginTransaction() .add(R.id.fragment_container, fragment) .commit() } } }为了以代码的方式把fragment添加给activity,这里显式调用了activity的FragmentManager。我们使用 supportFragmentManager属性就能获取activity的fragment管理器。 因为使用了Jetpack库版本的fragment和AppCompatActivity类,所以这里用的是supportFragmentManager。