Фрагмент карты Google внутри фрагмента - PullRequest
0 голосов
/ 14 сентября 2018

Следовал учебник по работе с Google Maps, и он работает хорошо. Теперь я хотел бы поместить эту карту во фрагмент для TableLayout и не могу понять, как изменить код для SupportFragmentManager (который выдает ошибку). Я получаю «Недоступный код», когда заменяю его на childFragmentManager.

Вот мой код:

class FragItLocate : Fragment(), OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

    private lateinit var mMap: GoogleMap

    override fun onMarkerClick(p0: Marker?)=false

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.frag_it_locate,container,false)

        val mapFragment = childFragmentManager
                .findFragmentById(R.id.map2) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap

        mMap.setOnMarkerClickListener(this)
        mMap.uiSettings.isZoomControlsEnabled = true
        // Add a marker in Atlantic Lawn and Garden and move the camera
        val alg = LatLng(41.4958611, -71.3768593)
        mMap.addMarker(MarkerOptions().position(alg).title("Atlantic Lawn and Garden"))
        mMap.moveCamera(CameraUpdateFactory.newLatLng(alg))
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(alg, 17.05f))


    }
}

Обновление: Я пробовал ответить, но мое приложение зависало с этой ошибкой

1 Ответ

0 голосов
/ 14 сентября 2018

Потому что когда вы звоните по этой линии

return inflater.inflate(R.layout.frag_it_locate, container, false)

выйдет из метода onCreateView и не выполнит все операторы после этой строки. Вот почему вы получаете UNREACHABLE CODE ошибку.

Поэтому измените свой код на

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
      val mapFragment = childFragmentManager
                .findFragmentById(R.id.map2) as SupportMapFragment
      mapFragment.getMapAsync(this)

      return inflater.inflate(R.layout.frag_it_locate, container, false);
}

Обновление: Вы получили эту ошибку, потому что эта строка.

val mapFragment = childFragmentManager
                .findFragmentById(R.id.map2) as SupportMapFragment

Если findFragmentById(R.id.map2) вернуть null, ваше приложение упадет, потому что вы используете оператор Unsafe Cast.

Вы можете предотвратить это с помощью оператора Smart Cast.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
      val mapFragment = childFragmentManager
                .findFragmentById(R.id.map2) as SupportMapFragment?
      mapFragment?.getMapAsync(this)

      return inflater.inflate(R.layout.frag_it_locate, container, false);
}

Обновление 2: На основании вашего комментария о onMapReady не вызывается.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val mapFragment = childFragmentManager
            .findFragmentById(R.id.map2) as SupportMapFragment?

    if (mapFragment == null) {
        mapFragment = SupportMapFragment.newInstance();
        childFragmentManager.beginTransaction().replace(R.id.map2, mapFragment).commit();
    }

    mapFragment?.getMapAsync(this)

    return inflater.inflate(R.layout.frag_it_locate, container, false);
}
...