我目前正在使用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。
预先感谢
答案 0 :(得分:1)
几件事:
1)不需要保留supportFragmentManager
的引用,直接使用它(因为我不确定初始化Activity时它是否为空)
2)尝试删除addToBackStack(null)
并使用findFragmentByTag("DEVICE_FRAGMENT")
3)最重要的是,不要尝试从Activity中访问Fragment的“内容”,而是要对Adapter本身进行初始化/填充。由于Fragment有其自己的生命周期,因此您可能会尝试在错误的生命周期中访问“事物”