Создание backstack как нижней панели навигации Instagram - PullRequest
0 голосов
/ 19 февраля 2019

Мне было интересно, как я могу создать что-то похожее на backstack в Instagram.

У меня есть приложение с нижней панелью навигации, которая открывает 3 разных фрагмента (MapFragment, HostFragment, ProfileFragment), внутри HostFragment, я создаю новый с именем Host2Fragment, когда пользователь нажимает кнопку:

    Tab1          Tab2           Tab3
[MapFragment][HostFragment][ProfileFragment]
                   .
                   .
                   .
             [Host2Fragment] 

Некоторые примеры:

ПРИМЕЧАНИЕ: Tab1 / MapFragment является домашним фрагментом

  • Пользователь включен Host2Fragment, при нажатии назад происходит возврат к HostFragment
    • , при повторном нажатии - Tab1
  • Пользователь включен Host2Fragment, щелкнув по Tab2 , можно вернуться к HostFragment

По сути, нажав назад, следуетпросто откройте все слои обратно к домашнему фрагменту (Tab1) и обновите нижнюю панель навигации.Я также хочу сохранить состояние фрагментов, чтобы при нажатии на него оно все равно оставалось в том же состоянии

Что у меня есть:

MainActivity

class MainActivity : AppCompatActivity(){
    private val mapFragment: Fragment = MapFragment()
    private val hostFragment: Fragment = HostFragment()
    private val profileFragment: Fragment = ProfileFragment()
    private val fm = supportFragmentManager
    private var activeFragment = mapFragment

    lateinit var toolbar: ActionBar
    private val mOnNavigationItemSelectedListener =
        BottomNavigationView.OnNavigationItemSelectedListener { item ->

            when (item.itemId) {
            R.id.navigation_map -> {
                fm.beginTransaction().hide(activeFragment).show(mapFragment).commit()
                activeFragment = mapFragment
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_host -> {
                fm.beginTransaction().hide(activeFragment).show(hostFragment).commit()
                activeFragment = hostFragment
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_profile -> {
                fm.beginTransaction().hide(activeFragment).show(profileFragment).commit()
                activeFragment = profileFragment
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        fm.beginTransaction().add(R.id.container, profileFragment, "profileFragment").hide(profileFragment).commit()
        fm.beginTransaction().add(R.id.container, hostFragment, "hostFragment").hide(hostFragment).commit()
        fm.beginTransaction().add(R.id.container, mapFragment, "mapFragment").commit()

        toolbar = supportActionBar!!
        val bottomNavigation: BottomNavigationView = findViewById(R.id.navigationView)
        bottomNavigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

        //the home Fragment
        bottomNavigation.selectedItemId = R.id.navigation_map
    }
}

HostFragment

class HostFragment : Fragment(){
    companion object {
        private const val TAG = "HostFragment"
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_host, container, false)
        return view
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val button = view.findViewById(R.id.button) as Button
        button.setOnClickListener{
            Log.d(HostFragment.TAG, "Clicked Host button")
            fragmentManager?.beginTransaction()?.add(R.id.container, Host2Fragment(), "host2Fragment")?.commit()
        }
    }
}
...