Android 我能';无法通过ID或标签找到片段

Android 我能';无法通过ID或标签找到片段,android,android-studio,android-fragments,kotlin,Android,Android Studio,Android Fragments,Kotlin,我目前正在Android Studio中编写一个应用程序,我遇到了一个大问题。主要的问题是,我想要一个包含片段的活动,而这个片段有一个微调器。我想按id查找微调器,但它总是返回null,我读到如果findViewById不在我刚才设置的ContentView中,我就不能使用它。因此,我目前正在尝试查找包含微调器的片段,但我也找不到该片段,我尝试了FragmentManager中的findFragmentById和findViewById。我总是得到一个TypeCastException,如果我尝

我目前正在Android Studio中编写一个应用程序,我遇到了一个大问题。主要的问题是,我想要一个包含片段的活动,而这个片段有一个微调器。我想按id查找微调器,但它总是返回null,我读到如果findViewById不在我刚才设置的ContentView中,我就不能使用它。因此,我目前正在尝试查找包含微调器的片段,但我也找不到该片段,我尝试了FragmentManager中的findFragmentById和findViewById。我总是得到一个TypeCastException,如果我尝试findFragmentById(…)!!它抛出一个空指针

这是我的主要活动:

    class MainActivity : AppCompatActivity() {

        private val manager: FragmentManager? = supportFragmentManager

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            showDeviceFragment()

            val fragment = manager!!.findFragmentById(R.id.fragment_holder) as DeviceFragment
            val options = arrayOf("Wandhalterung (Arm)", "Gestellhalterung (Arm)", "Gestellhalterung")
            fragment.option.adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, options)
    }

    fun showDeviceFragment() {
        val transaction = manager!!.beginTransaction()
        val fragment = DeviceFragment()
        transaction.add(R.id.fragment_holder, fragment, "DEVICE_FRAGMENT")
        transaction.addToBackStack(null)
        transaction.commit()
    }
}
碎片固定器只是一个框架布局

提前感谢

几件事:

1) 无需保留
supportFragmentManager
的引用,直接使用它(因为我不确定在初始化活动时它是否为null)

2) 尝试删除
addToBackStack(null)
并使用
findFragmentByTag(“设备片段”)


3) 最重要的是,不要试图从活动中访问片段的“东西”,而是进行适配器初始化/填充片段本身。因为片段有自己的生命周期,如果需要在活动中使用微调器,您可能会尝试在错误的生命周期中访问“东西”

,最好的方法是在片段中创建一个getter,并在活动中创建变量,以将片段保存在oncreate中。在片段内部,您可以在onViewCreated with view.findViewById.FragmentTransactions中找到微调器。片段事务延迟执行,而不是立即执行。但无论如何,您应该只在片段内部初始化片段视图。
class DeviceFragment : Fragment() {

lateinit var option : Spinner

companion object {
    fun newInstance(): DeviceFragment {
        return DeviceFragment()
    }
}

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.fragment_device, container, false)
    option = view.spinner

    return inflater?.inflate(R.layout.fragment_device, container, false)
}

}