You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何将Activity转换为Fragment适配底部导航栏?

将Activity转换为Fragment适配底部导航栏的分步指南

转换后的完整Fragment代码

class CalculatorOZFragment : Fragment() {

    private lateinit var binding: FragmentCalculatorBinding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentCalculatorBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
        binding.btnGo.setOnClickListener {
            val df = DecimalFormat("#.#", DecimalFormatSymbols(Locale.ENGLISH))

            val firstValue = binding.etContainerSizeOz.text.toString().toFloat()
            val secondValue = binding.etDilutionRatio.text.toString().toFloat() + 1

            val totalProduct: Double = String.format("%.0f", firstValue / secondValue).toDouble()
            val totalWater: Double = String.format("%.0f", firstValue - totalProduct).toDouble()

            binding.tvTotalProduct.text = totalProduct.toString()
            binding.tvTotalWater.text = totalWater.toString()
        }
    }
}

核心转换要点

  • 类继承变更:直接替换父类为Fragment,这是从Activity转Fragment的核心基础。
  • 视图初始化逻辑调整:
    • 把原Activity中onCreate里的布局绑定移到Fragment的onCreateView方法,通过传入的inflater和container完成绑定,注意第三个参数传false,避免Fragment视图被自动添加到容器(宿主Activity会负责管理)。
    • 所有视图交互逻辑(比如按钮点击)必须放在onViewCreated方法中,确保视图已完全创建。
  • 移除冗余方法:删除setContentView调用,Fragment通过返回binding.root提供视图。

适配底部导航栏的基础步骤

  1. 配置宿主Activity布局:在主Activity的布局中添加BottomNavigationView和Fragment容器(比如FrameLayout):

    <!-- activity_main.xml -->
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    
        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_nav"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:menu="@menu/bottom_nav_menu"/>
    </LinearLayout>
    
  2. 主Activity实现导航切换:

    class MainActivity : AppCompatActivity() {
        private lateinit var binding: ActivityMainBinding
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    
            // 默认加载CalculatorOZFragment
            if (savedInstanceState == null) {
                supportFragmentManager.beginTransaction()
                    .replace(R.id.fragment_container, CalculatorOZFragment())
                    .commit()
            }
    
            binding.bottomNav.setOnItemSelectedListener { item ->
                when (item.itemId) {
                    R.id.nav_calculator -> {
                        supportFragmentManager.beginTransaction()
                            .replace(R.id.fragment_container, CalculatorOZFragment())
                            .commit()
                        true
                    }
                    // 其他底部导航项对应的Fragment切换逻辑
                    else -> false
                }
            }
        }
    }
    

新手注意事项

  • 空值安全优化:给输入框文本转Float添加空值判断,避免崩溃:
    val firstValue = binding.etContainerSizeOz.text.toString().toFloatOrNull() ?: 0f
    val secondValue = (binding.etDilutionRatio.text.toString().toFloatOrNull() ?: 0f) + 1
    
  • 生命周期差异:Fragment的生命周期和Activity不同,后续处理数据保存、视图重建等逻辑要遵循Fragment的生命周期规则。

内容的提问来源于stack exchange,提问作者fredos86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:00:02