我正在学习Kotiln。所以,我希望实现的是这个。我有一个带有容器的主活动,显示了第一个片段 (A(。从片段 A 中,我希望打开第二个片段 (B(,按钮位于片段 A 上。然后通过后退按钮再次显示片段 A(将其添加到堆栈(。
主要活动:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, MainFragment.newInstance())
.commitNow()
}
val btn = findViewById<Button>(R.id.buttonFragment) //null
btn.setOnClickListener {
supportFragmentManager.beginTransaction()
.add(R.id.container, SecondFragment.newInstance())
.commitNow()
}
}
}
片段 A:
class MainFragment : Fragment() {
companion object {
fun newInstance() = MainFragment()
}
//private lateinit var viewModel: MainViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.main_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
//viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
// TODO: Use the ViewModel
}
}
片段 B(与 A 相同(: 类 SecondFragment : Fragment(( {
companion object {
fun newInstance() = SecondFragment()
}
//private lateinit var viewModel: SecondViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.second_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
//viewModel = ViewModelProviders.of(this).get(SecondViewModel::class.java)
// TODO: Use the ViewModel
}
}
按钮位于main_fragment.xml
如果您需要在片段之间使用后退按钮导航,请使用add
而不是replace
:
supportFragmentManager.beginTransaction()
.add(R.id.container, MainFragment.newInstance())
.addToBackstack(null)
.commitNow()
[可选] 我使用这两个方便的扩展功能在我的活动中执行添加和替换:
fun AppCompatActivity.addFragment(fragment: Fragment, containerId: Int) {
supportFragmentManager
.beginTransaction()
.addToBackStack(null)
.add(containerId, fragment, fragment::class.java.simpleName)
.commit()
}
fun AppCompatActivity.replaceFragment(fragment: Fragment, containerId: Int) {
supportFragmentManager
.beginTransaction()
.replace(containerId, fragment, fragment::class.java.simpleName)
.commit()
}
对于当片段 A 中发生事件时需要将片段 B 添加到活动后退堆栈中的片段 A 顶部的部分:
您可以使用回调接口:
您的片段定义协定(接口(
FragmentA {
interface Callback {
onSomeEventHappened()
}
private var listener: Callback? = null
override fun onAttach(context: Context) {
if (context is Callback) {
listener = context
} else throw Exception()
}
fun onSomeClickHappened() {
listener.onSomeEventHappened()
}
}
您的活动接受该合同
class MainActivity : FragmentA.Callback {
override fun onSomeEventHappened() {
//Replace or Add fragment
}
}