Solution 1 :
Few things:
1) No need to hold reference for supportFragmentManager
, use it directly (because i am not sure if it will be null when Activity is initialized)
2) Try removing addToBackStack(null)
and using findFragmentByTag("DEVICE_FRAGMENT")
3) Most importantly, Don’t try to access “things” of Fragment from Activity, do those Adapter initialization/fill in the Fragment itself. Because Fragment has its own lifecycle and you may try to access “things” at wrong lifecycle
Problem :
i am currently programming an app in Android Studio and i am having a big issue. The main problem is, that i want an activity with a fragment in it and this fragment has got a spinner. I wanted to find the spinner by id, but it always returned null and i read that i can’t use findViewById if it is not in the ContentView i just set. So i am currently trying to find the fragment that contains the spinner, but i also can’t find the fragment, i tried findFragmentById and findViewById from the FragmentManager. I always get a TypeCastException and if i try findFragmentById(…)!! it throws a NullPointer.
This is my 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()
}
}
And this is the 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)
}
}
The fragment_holder just is a FrameLayout.
Thanks in advance
Comments
Comment posted by Illuyankas
If you need to use your spinner inside your activity, the best way is to made a getter inside your fragment and create varaible inside your actitivy to save your fragment in the oncreate. Inside the fragment you can find your spinner in the onViewCreated with view.findViewById.
Comment posted by EpicPandaForce
FragmentTransactions are executed deferred and not immediately. But you should be initializing Fragment views only inside the Fragment anyway.