我正在学习Kotiln。因此,我希望实现的是这一点。我有一个MainActivity,容器显示了第一个片段(A)。我希望从片段A中打开第二个片段(B),并使用片段A上的按钮。然后通过返回按钮再次显示片段A(将其添加到堆栈中)。
MainActivity:
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相同): class 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
答案 0 :(得分:1)
如果需要在片段之间使用后退按钮导航,请使用add
而不是replace
:
supportFragmentManager.beginTransaction()
.add(R.id.container, MainFragment.newInstance())
.addToBackstack(null)
.commitNow()
[可选]我使用这两个方便的扩展功能在我的Activity中执行添加和替换:
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()
}
对于需要在FragmentA内部发生事件时将FragmentB添加到Activity back堆栈中FragmentA顶部的部分:
您可以使用回调接口:
您的片段定义合同(接口)
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
}
}