Фрагмент карты (Kotlin) на картеReady не работает - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь реализовать карту во фрагменте, и я могу показать карту, но onMapReady не работает, так как не добавляет маркер и не перемещает камеру. Код

MapFragment

class MapFragment : Fragment(), OnMapReadyCallback {

   private lateinit var mMap: GoogleMap

    companion object {
        var mapFragment : SupportMapFragment?=null
        val TAG: String = MapFragment::class.java.simpleName
        fun newInstance() = MapFragment()
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        var rootView = inflater.inflate(R.layout.fragment_map, container, false)

            mapFragment = fragmentManager?.findFragmentById(R.id.fallasMap) as SupportMapFragment?
            mapFragment?.getMapAsync(this)

        return rootView
    }

    override fun onMapReady(googleMap: GoogleMap?) {
        mMap = googleMap!!
        // Add a marker in Sydney and move the camera
        val sydney = LatLng(-34.0, 151.0)
        mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
    }

}

xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
             tools:context=".fragments.MapFragment">

        <fragment
                android:id="@+id/fallasMap"
            android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

</FrameLayout>

Ответы [ 4 ]

0 голосов
/ 06 марта 2019

Вы используете неправильный менеджер фрагментов для доступа к нему.Поскольку это фрагмент внутри фрагмента, он добавляется к childFragmentManager.

childFragmentManager.findFragmentById(R.id.fallasMap) as SupportMapFragment

. Также используйте оператор приведения as? вместо приведения к необязательному типу.Или даже сделать обычное приведение, так как вам нужно, чтобы фрагмент был правильным, а null было бы ошибкой.

Также не храните статическую ссылку на фрагмент, если вы не очистите его должным образом.

0 голосов
/ 05 марта 2019

Неправильно использовать глобальные переменные в вашем случае. Вы должны удалить их из companion object и создавать новый экземпляр каждый раз, когда открываете фрагмент.

Когда rootView != null onMapReadyметод не будет вызываться.

Поэтому я предлагаю удалить их из companion object и поместить их в onCreateView без условия if (rootView == null) (удалить условие).

0 голосов
/ 05 марта 2019

Используйте supportFragmentManager, чтобы найти SupportMapFragment

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    var rootView = inflater.inflate(R.layout.fragment_map, container, false)
    mapFragment = supportFragmentManager?.findFragmentById(R.id.fallasMap) as SupportMapFragment?
    mapFragment?.getMapAsync(this)

    return rootView
}

Если вы не настраиваете свой фрагмент, то внутри вашего XML-файла тоже

<fragment
     android:id="@+id/fallasMap"
     android:name="com.google.android.gms.maps.SupportMapFragment"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />
0 голосов
/ 05 марта 2019

Вы должны передать значение googleMap в mMap для взаимодействия с вашими маркерами

        override fun onMapReady(googleMap: GoogleMap?) {
        mMap = googleMap 
       // Add a marker in Sydney and move the camera
        val sydney = LatLng(-34.0, 151.0)
        mMap.addMarker(MarkerOptions().position(sydney).title("Marker in  
        Sydney"))
      mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...