как закрыть фрагменты, чтобы увидеть активность ниже, используя OnNavigationItemSelectedListener - PullRequest
0 голосов
/ 07 января 2019

Таким образом, способ создания моего приложения - у меня есть MapsActivity, который загружается при запуске приложения, и у меня есть нижний виджет навигации, который имеет 3 значка, и он выбран по умолчанию на первом значке (который у меня есть названная карта). две другие иконки при выборе являются фрагментами.

Я пытаюсь закрыть фрагмент, когда нажимаю на значок карты в виджете навигации, поскольку это по сути моя основная деятельность.

this is what i have

теперь я застрял и не могу вернуться к своему MapsActivity, потому что я не знаю, как закрыть фрагмент

MapsActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_maps)
    val mapFragment = supportFragmentManager
        .findFragmentById(R.id.map) as SupportMapFragment
    mapFragment.getMapAsync(this)

    val bottomNavigation: BottomNavigationView = findViewById(R.id.bottom_navigation)
    bottomNavigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

    getAutoCompleteSearchResults()
}

...

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener {item->
    when(item.itemId){
        R.id.nav_map -> {
            Log.d(TAG, "map pressed")
            // if there's a fragment, close it
            return@OnNavigationItemSelectedListener true
        }
        R.id.nav_A -> {
            Log.d(TAG, "Fragment A pressed")
            replaceFragment(FragmentA())
            return@OnNavigationItemSelectedListener true
        }
        R.id.nav_B -> {
            Log.d(TAG, "Fragment B pressed")
            replaceFragment(FragmentB())
            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

...

private fun replaceFragment(fragment: Fragment){
    val fragmentTransaction = supportFragmentManager.beginTransaction()

    fragmentTransaction.replace(R.id.fragmentContainer, fragment)
    fragmentTransaction.commit()
}

1 Ответ

0 голосов
/ 07 января 2019

Вы можете найти прикрепленный в данный момент фрагмент и отсоединить его от действия:

private fun detachFragment(fragment: Fragment){
val fragmentTransaction = supportFragmentManager.beginTransaction()

fragmentTransaction.detach(fragment)
fragmentTransaction.commit()
}
...

И есть метод проверки видимого фрагмента:

private fun getVisibleFragment(): Fragment? {
val fragmentManager = MapsActivity.getSupportFragmentManager()
val fragments = fragmentManager.getFragments()
if(fragments != null) {
    for (fragment: Fragment in fragments) {
        if (fragment != null && fragment.isVisible()) {
            return fragment
        }
    return null
    }
}
...

Затем используйте его внутри своей MainActivity:

...
when(item.itemId){
    R.id.nav_map -> {
        Log.d(TAG, "map pressed")
        // if there's a fragment, close it
        val visibleFragment = getVisibleFragment()
        if(visibleFragment != null && visibleFragment.getId() != R.id.map) {
            detachFragment(visibleFragment)
        }

        return@OnNavigationItemSelectedListener true
    }
...
...