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