Фрагменты ViewPager не инициализируются сразу - PullRequest
1 голос
/ 25 апреля 2019

У меня есть ViewPager с адаптером FragmentStatePagerAdapter. Для простоты у меня есть 2 фрагмента в моем ViewPager.

class MyPagerAdapter(fragmentManager: FragmentManager): FragmentStatePagerAdapter(fragmentManager) {
    var firstFragment: SampleFragment? = null
    var secondFragment: SampleFragment? = null

    override fun getItem(position: Int): Fragment {
        return when(position) {
            0 -> SampleFragment()
                .also { firstFragment = it }
            1 -> SampleFragment()
                .also { secondFragment = it }
            else -> Fragment()
        }
    }

    override fun getCount(): Int {
        return 2
    }

}

My SampleFragment - это простой фрагмент с TextView на виде.

class SampleFragment: Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_sample, container, false)
    }

    fun setText(text: String) {
        text_view.text = text
    }
}

Теперь я в MainActivity, где у меня есть ViewPager, у меня ниже строки

val adapter = MyPagerAdapter(supportFragmentManager)
view_pager.adapter = adapter

adapter.firstFragment?.setText("Some Text")

Итак, вот проблема. После инициализации (установки адаптера) моего ViewPager я ожидаю, что мои фрагменты будут созданы. Но это не так. Мои фрагменты инициализируются после определенной задержки. Поэтому, когда я хочу установить текст TextView внутри моего фрагмента с помощью строки

adapter.firstFragment?.setText("Some Text")

firstFragment равно нулю.

Когда я отлаживаю, я вижу это после

view_pager.adapter = adapter

getCount() адаптера вызывается. А потом adapter.firstFragment? .setText ("Некоторый текст") будет выполнен, который не имеет никакого эффекта, так как firstFragment равно null. И через секунду или около того getItem() адаптера вызывается.

Итак, мой вопрос: почему фрагменты адаптера моего viewpager не инициализируются сразу? Если я что-то упустил, не могли бы вы указать. Или же ожидается поведение ViewPager Adapter, тогда как я могу сделать так, чтобы фрагменты viewpager инициализировались при инициализации пейджера?

1 Ответ

1 голос
/ 25 апреля 2019

Имейте в виду, что при создании адаптера вы запускаете onCreate со своего Activity. Инициализация представлений фрагментов выполняется только после того, как Activity завершил инициализацию своего представления. Таким образом, представления фрагментов недоступны в onCreate.

Итак, чтобы инициализировать некоторые значения фрагмента, вы можете сделать это: (код в Java, вы можете изменить на Kotlin ...)

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i1) {
        }

        @Override
        public void onPageSelected(int i) {
            switch (i) {
                case 0:
                   // init for first fragment
                break;   
                case 1:
                   // init for second fragment
                break; 
            }
        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });
...