Android - фрагмент карты Google в MapsActivity не отвечает после отсоединения фрагмента - PullRequest
0 голосов
/ 07 января 2019

У меня есть MapsActivity, которую я создал с помощью одного из шаблонов студии android, и я добавил панель навигации внизу, где у меня есть 3 значка (Активность карты, Фрагмент A, Фрагмент B). Я могу отображать фрагменты и переключаться между ними, а также переключаться обратно на MapsActivity.

Проблема: заключается в том, что когда я нажимаю на значок активности карты, чтобы вернуться к MapsActivity из фрагмента, фрагмент отсоединяется, и я вижу свои MapsActivity, но Фрагмент карты Google не будет "заморожен", я не могу прокрутить. Но моя строка поиска вверху, которая является еще одним статическим фрагментом, все еще работает.

Вот пример того, что я имею в виду: enter image description here


Вот как я это реализовал:

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, detach it
            val visibleFrag = getVisibleFragment()
            if(visibleFrag != null){
                detachFragment(visibleFrag)
            }
            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()
}

...

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

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

    fragmentTransaction.remove(fragment)
    fragmentTransaction.commit()
}

activity_maps.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:id="@+id/fragmentContainer">

    <fragment
            android:id="@+id/place_autocomplete_fragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment"
    />
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/map"
              tools:context=".MapsActivity"
              android:name="com.google.android.gms.maps.SupportMapFragment"
              android:layout_below="@id/place_autocomplete_fragment"
              android:layout_above="@id/bottom_navigation"
    />
    <android.support.design.widget.BottomNavigationView
            android:id="@+id/bottom_navigation"
            app:menu="@menu/bottom_nav_menu"
            android:background="@color/colorPrimaryDark"
            android:layout_width="match_parent"
            app:itemIconTint="@color/common_google_signin_btn_text_dark_default"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true" android:layout_marginBottom="0dp"
            android:layout_alignParentLeft="true" android:layout_marginLeft="0dp"
            android:layout_alignParentStart="true" android:layout_marginStart="0dp"/>
</RelativeLayout>

EDIT

Мне кажется, я знаю, почему фрагмент моей карты "зависает" каждый раз, когда я отсоединяю свои фрагменты. Это потому, что в моей функции getVisibleFragment я перебираю ВСЕ фрагменты, включая мой supportMapFragment. Как проверить в цикле for, является ли фрагмент supportMapFragment?

РЕДАКТИРОВАТЬ 1.1 Я пытался сделать это в R.id.nav_map -> {, но все еще не могу это исправить.

for (fragment in supportFragmentManager.fragments) {
    if (fragment is SupportMapFragment) {
        continue
    } else if (fragment != null) {
        supportFragmentManager.beginTransaction().remove(fragment).commit()
    }
}
...