我无法通过其ID或标签找到片段

时间:2020-02-26 14:58:00

标签: android android-studio android-fragments kotlin

我目前正在使用Android Studio编写应用程序,而我遇到了一个大问题。主要问题是,我想要一个包含片段的活动,并且该片段有一个微调器。我想通过id查找微调框,但它始终返回null,并且我读到,如果它不在刚刚设置的ContentView中,则无法使用findViewById。所以我目前正在尝试查找包含微调器的片段,但我也找不到该片段,我尝试了来自FragmentManager的findFragmentById和findViewById。我总是得到TypeCastException,如果我尝试findFragmentById(...)!它会抛出一个NullPointer。

这是我的MainActivity:

    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()
    }
}

这是DeviceFragment:

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)
}

}

fragment_holder只是一个FrameLayout。

预先感谢

1 个答案:

答案 0 :(得分:1)

几件事:

1)不需要保留supportFragmentManager的引用,直接使用它(因为我不确定初始化Activity时它是否为空)

2)尝试删除addToBackStack(null)并使用findFragmentByTag("DEVICE_FRAGMENT")

3)最重要的是,不要尝试从Activity中访问Fragment的“内容”,而是要对Adapter本身进行初始化/填充。由于Fragment有其自己的生命周期,因此您可能会尝试在错误的生命周期中访问“事物”