Я не могу найти фрагмент ни по его идентификатору, ни по тегу - PullRequest
0 голосов
/ 26 февраля 2020

Я сейчас программирую приложение в Android Studio, и у меня большая проблема. Основная проблема в том, что я хочу занятие с фрагментом, и у этого фрагмента есть счетчик. Я хотел найти счетчик по идентификатору, но он всегда возвращал ноль, и я прочитал, что не могу использовать findViewById, если его нет в ContentView, который я только что установил. Так что в настоящее время я пытаюсь найти фрагмент, который содержит спиннер, но я также не могу найти фрагмент, я попробовал findFragmentById и findViewById из FragmentManager. Я всегда получаю 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)
}

}

Держатель фрагмента просто является FrameLayout.

Заранее спасибо

1 Ответ

1 голос
/ 26 февраля 2020

Несколько вещей:

1) Нет необходимости хранить ссылку на supportFragmentManager, используйте ее напрямую (потому что я не уверен, будет ли она нулевой, когда инициализируется активность)

2 ) Попробуйте удалить addToBackStack(null) и использовать findFragmentByTag("DEVICE_FRAGMENT")

3) Самое главное, не пытайтесь получить доступ к «вещам» фрагмента из действия, выполните инициализацию адаптера / заполните сам фрагмент. Поскольку Fragment имеет свой собственный жизненный цикл, и вы можете попытаться получить доступ к «вещам» в неправильном жизненном цикле

...