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。