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

Kotlin Fragment无报错但无法正常工作问题求助

问题描述

我是丹麦Spin Robotics的实习生,目前在学习Kotlin基础,比如开发带日期选择器的应用。我完成了基础设置,预期点击按钮可以切换Fragment并显示提示信息(Fragment正式UI还没做),但现在默认应该显示“tool action is here”的Fragment没有加载,按钮点击也完全没反应。我试过多个教程和网络搜索都没解决,附上我的MainActivity.kt代码:

package com.example.mycbunapp

import android.os.Bundle
import android.view.View
import android.view.Window
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.example.mycbunapp.databinding.ActivityMainBinding
import com.kassowrobots.api.lang.Load

//https://www.youtube.com/watch?v=rpzuEN8UhUQ
class MainActivity : AppCompatActivity() {

 private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)



        binding.btnToolAction.setOnClickListener{
            replaceFragment(ToolActionFragment()) // hvis de klikker på den knap ser de den her
        }

        binding.btnLoadScrew.setOnClickListener{
            replaceFragment(LoadScrewFragment()) // hvis de klikker på den knap ser de den her
        }
        binding.btnAttachBit.setOnClickListener{
            replaceFragment(BitAttachFragment()) // hvis de klikker på den knap ser de den her
        }

       // val btnActionTools : Button = findViewById(R.id.btn_toolAction)
       // val btnloadScrew : Button = findViewById(R.id.btn_loadScrew)
       // val btnbitAttach : Button = findViewById(R.id.btn_attachBit)




    }

    private fun replaceFragment(fragment : Fragment) {
        val fragmentManager = supportFragmentManager
        val fragmentTransaction = fragmentManager.beginTransaction()
        fragmentTransaction.replace(R.id.fragmentContainerView, fragment)
        fragmentTransaction.commit()

    }

    private fun setFullscreen() {
        requestWindowFeature(Window.FEATURE_NO_TITLE)
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_FULLSCREEN
                or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)

    }

}
解决方案

1. 加载默认Fragment

你的代码未在启动时主动加载默认的ToolActionFragment,导致Fragment容器为空。在onCreate方法末尾添加初始化代码:

replaceFragment(ToolActionFragment())

2. 校验视图绑定与布局匹配

  • 确认布局文件activity_main.xml中,按钮ID为btn_toolAction、btn_loadScrew、btn_attachBit(视图绑定会将下划线命名转为驼峰,比如btn_toolAction对应binding.btnToolAction)
  • 确保布局中存在ID为fragmentContainerView的Fragment容器(可以是FragmentContainerView或FrameLayout组件)

3. 检查Fragment实现

确认所有Fragment类正确实现了视图创建逻辑,以ToolActionFragment为例:

class ToolActionFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val textView = TextView(context)
        textView.text = "tool action is here"
        return textView
    }
}

如果onCreateView返回null或未正确创建视图,会导致Fragment无法显示。

4. 修复全屏设置逻辑

setFullscreen()方法未被调用,且requestWindowFeature需要在setContentView之前执行,调整代码顺序:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setFullscreen()
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    // 按钮点击事件与默认Fragment加载代码...
}

5. 优化Fragment事务

可以给事务添加返回栈,同时确保提交逻辑正常:

private fun replaceFragment(fragment : Fragment) {
    val fragmentManager = supportFragmentManager
    val fragmentTransaction = fragmentManager.beginTransaction()
    fragmentTransaction.replace(R.id.fragmentContainerView, fragment)
    fragmentTransaction.addToBackStack(null)
    fragmentTransaction.commit()
}

内容的提问来源于stack exchange,提问作者Tobias Søderholm Danielsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:12:39