Мне было интересно, как я могу создать что-то похожее на 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()
}
}
}