概述
本文使用的kotlin语言编写,关于点击不同按钮切换到不同的Fragment,关于Fragment大家可以去菜鸟教程上了解,很详细。
实现
先上MainActivity.kt的代码:
class MainActivity : AppCompatActivity(),View.OnClickListener{//定义fragmentprivate var fg1: BlankFragment? = nullprivate var fg2: MyFragment2? = nullprivate var fg3: MyFragment3? = nullprivate var fg4: MyFragment4? = null//定义按钮private var rb1: RadioButton? = nullprivate var rb2: RadioButton? = nullprivate var rb3: RadioButton? = nullprivate var rb4: RadioButton? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)rb1 = findViewById<RadioButton>(R.id.today_tab)rb2 = findViewById<RadioButton>(R.id.record_tab)rb3 = findViewById<RadioButton>(R.id.contact_tab)rb4 = findViewById<RadioButton>(R.id.settings_tab)//设置监听rb1!!.setOnClickListener(this)rb2!!.setOnClickListener(this)rb3!!.setOnClickListener(this)rb4!!.setOnClickListener(this)//第一次初始化首页默认显示第一个fragmentinitBlankFragment()}//显示第一个private fun initBlankFragment() {//开启事务,fragment的控制是由事务来实现的val transaction: FragmentTransaction = supportFragmentManager.beginTransaction()//add,初始化fragment并添加到事务中,如果为null就new一个if (fg1 == null){fg1 = BlankFragment()transaction.add(R.id.fragment_container, fg1!!)}//方法二:replace,初始化fragment// if(f1 == null){// f1 = BlankFragment()// }// transaction.replace(R.id.fragment_container, f1!!)//提交事务transaction.commit()}//显示第二个private fun initFragment2() {val transaction: FragmentTransaction = supportFragmentManager.beginTransaction()if (fg2 == null){fg2 = MyFragment2()transaction.add(R.id.fragment_container, fg2!!)}hideFragment(transaction)transaction.show(fg2!!)transaction.commit()}//显示第三个private fun initFragment3() {val transaction: FragmentTransaction = supportFragmentManager.beginTransaction()if (fg3 == null){fg3 = MyFragment3()transaction.add(R.id.fragment_container, fg3!!)}hideFragment(transaction)transaction.show(fg3!!)transaction.commit()}//显示第四个private fun initFragment4() {val transaction: FragmentTransaction = supportFragmentManager.beginTransaction()if (fg4 == null){fg4 = MyFragment4()transaction.add(R.id.fragment_container, fg4!!)}hideFragment(transaction)transaction.show(fg4!!)transaction.commit()}//隐藏所有的fragmentprivate fun hideFragment(transaction: FragmentTransaction) {if(fg1 != null){transaction.hide(fg1!!)}if (fg2 != null) {transaction.hide(fg2!!)}if (fg3 != null) {transaction.hide(fg3!!)}if (fg4 != null) {transaction.hide(fg4!!)}}override fun onClick(v: View?) {if (v === rb1) {initBlankFragment()} else if (v === rb2) {initFragment2()} else if (v === rb3) {initFragment3()} else if (v === rb4) {initFragment4()}}}
上述代码定义了fragment,对于fragment的控制是由事务实现的。上述代码大家需要创建四个fragment,可以根据自己需要来创建若干个fragment,我的底部导航栏是四个按钮,创建对应的xml文件。下面展示其中一个MyFragment.kt代码,写一个类去继承Fragment类,重写onCreateView方法:
import android.Rimport android.os.Bundleimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport android.widget.TextViewimport androidx.fragment.app.Fragmentclass MyFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View {//write_report.xml文件,可以自己创建xml文件val view = inflater.inflate(com.example.petarunapp.R.layout.write_report, container, false)return view}}
FragmentTransaction的 add 和 replace 区别
关于FragmentTransaction,提供了add和replace方法:
add 和 replace 影响的只是界面,而控制回退的,是事务;
区别:
add 是把一个fragment添加到一个容器 container 里;
replace 是先remove掉相同id的所有fragment,然后在add当前的这个fragment。
fragment:
onCreate():在创建fragment时系统会调用此方法。在实现代码中,你可以初始化想要在fragment中保持的那些必要组件,当fragment处于暂停或者停止状态之后可重新启用它们。
onCreateView():在第一次为fragment绘制用户界面时系统会调用此方法。为fragment绘制用户界面,这个函数必须要返回所绘出的fragment的根View。如果fragment没有用户界面可以返回空。
onPause():系统会调用该函数作为用户离开fragment的第一个预兆。在当前用户会话结束之前,通常要在这里提交任何应该持久化的变化(因为用户可能不再返回)