从活动开始第二个片段



我正在学习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
}
}

相关内容

最新更新