фрагментная навигация против фрагмента контейнера - PullRequest
0 голосов
/ 05 августа 2020

при использовании навигации по фрагментам, когда я снова перемещаю temp1 в temp2 и temp2 на temp1, я вижу, что фрагмент создается заново. Но когда я использую fragmentManager.replace, он повторно использует фрагмент, который я уже использовал.

код возобновления

    private lateinit var binding : ActivityMainBinding
    private  var currentFragment: Fragment?=null
    private  var homeFragment = HomeFragment()
    private  var temp1Fragment =Temp1Fragment()
    private  var temp2Fragment= Temp2Fragment()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        initBottomNavItemClick()
        currentFragment = homeFragment
    }


    private fun initBottomNavItemClick(){
        binding.bottomNavigationView.setOnNavigationItemSelectedListener {
            when(it.itemId){
                R.id.homeFragment->{
                //    findNavController(R.id.navFragment).navigate(R.id.homeNavFragment)
                    currentFragment = homeFragment
                    changeFragment(this,binding.fragmentContainer,currentFragment!!)
                }
                R.id.tempFragment1->{
                   // findNavController(R.id.navFragment).navigate(R.id.temp1NavFragment)
                    currentFragment = temp1Fragment
                    changeFragment(this,binding.fragmentContainer,currentFragment!!)
                }
                R.id.tempFragment2->{
                   // findNavController(R.id.navFragment).navigate(R.id.temp2NavFragment)
                    currentFragment = temp2Fragment
                    changeFragment(this,binding.fragmentContainer,currentFragment!!)
                }
            }

            true
        }
    }

Поэтому, когда я использую fragmentManager, я могу сохранить Reclerview позиция, когда я вернусь, но не фрагментная навигация. При навигации по фрагментам создается новый фрагмент, и позиция начинается с 0. Возможно ли перемещение по фрагменту, чтобы предыдущий статус не генерировался заново?

1 Ответ

0 голосов
/ 06 августа 2020

Я отвечу на ваш вопрос в двух частях.

  • Решение
  • Пояснение

Решение

Не раздувайте вид каждый раз, когда возвращаетесь к предыдущему фрагменту. Сохраните View в локальной переменной и увеличьте ее только один раз. Предложено Иэном Ланке

private var savedViewInstance: View? = null

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    return if (savedViewInstance != null) {
        savedViewInstance
    } else {
        savedViewInstance =
                inflater.inflate(R.layout.fragment_professional_details, container, false)
        savedViewInstance
    }
}

Объяснение

Давайте разберемся жизненный цикл фрагмента под архитектурой навигации.

Сценарий : Мы берем два фрагмента, HomeFragment и DashboardFragment. Оба фрагмента принадлежат одному и тому же NavGraph, и начальная точка назначения - Домашний фрагмент.

Жизненный цикл фрагмента при запуске приложения-

HomeFragment: onAttach:

HomeFragment: onCreate:

HomeFragment: onCreateView:

HomeFragment: onViewCreated:

HomeFragment: onActivityCreated:

HomeFragment: onStart:

HomeFragment: onResume:

При навигации: Home Fragment ---> Dashboard Fragment

DashboardFragment: onAttach:

DashboardFragment: onCreate:

DashboardFragment: onCreateView:

DashboardFragment: onViewCreated:

DashboardFragment: * Активность

DashboardFragment: onStart:

DashboardFragment: onResume:

HomeFragment: onPause:

HomeFragment: onStop:

HomeFragment: onDestroyView:

В навигации: Dashb oard Fragment ---> Home Fragment

HomeFragment: onAttach:

HomeFragment: onCreate:

HomeFragment: onCreateView:

HomeFragment: onViewCreated:

HomeFragment: onActivityCreated:

HomeFragment: onStart:

HomeFragment: onResume:

DashboardFragment: onPause:

DashboardFragment: onStop:

HomeFragment: onDestroy:

DashboardFragment: onDestroyView:

DashboardFragment: onDestroy:

Если мы сохраняем представление на исходном HomeFragment: onCreateView() и увеличиваем одно и то же представление каждый раз для следующего вызова HomeFragment: onCreateView(), мы можем восстановить старое представление.

Если вы заметили HomeFragment: onDestroy() будет вызван, но после звонка HomeFragment: onViewCreated(). Вызов HomeFragment: onDestroy () просто уничтожает старый экземпляр HomeFragment.

Я по-прежнему считаю, что такой способ работы не лучший, но так будет до тех пор, пока Google не выдаст что-то вроде onFragemntRestore().

Чтобы действительно обновить представление, вам необходимо ViewModel и наблюдать за изменениями для изменения представлений.

Для получения дополнительной информации вы go можете go через this нить. удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...