[Kotlin] Fragment에 GoogleMap 설치

10800 단어 KotlinGoogleMapsAPI
이번에는 프로젝트에서 GoogleMap API를 가져와 세션에서 지도를 실현하는 절차를 정리할 것입니다.액티비티에 설치된 코드가 여럿 있지만, 프래그먼트에 설치된 코드는 잘 찾지 못했으니 꼭 참고해주세요.
완성도

Google Maps API 키 가져오기
프로젝트를 만들 때 Google Maps Activity 프로젝트를 만들기를 선택하십시오.이렇게 구글.maps_api.xml을 만들 수 있을 것 같습니다.
google_maps_api.xml
<resources>
    <!--
    TODO: Before you run your application, you need a Google Maps API key.

    To get one, follow this link, follow the directions and press "Create" at the end:

    https://console.developers.google.com/flows/enableapi?apiid=maps_android_backend&keyType=CLIENT_SIDE_ANDROID&r=5F:28:A4:CD:C1:9D:A8:5A:98:1F:29:B2:4A:7A:96:0F:43:D6:3E:96%3Bcom.google.codelab.usemap

    You can also add your credentials to an existing key, using these values:

    Package name:
    com.google.codelab.usemap

    SHA-1 certificate fingerprint:
    5F:28:A4:CD:C1:9D:A8:5A:98:1F:29:B2:4A:7A:96:0F:43:D6:3E:96

    Alternatively, follow the directions here:
    https://developers.google.com/maps/documentation/android/start#get-key

    Once you have your key (it starts with "AIza"), replace the "google_maps_key"
    string in this file.
    -->
    <string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR_KEY_HERE</string>
</resources>
https://console.developers.google.com/flows/enableapi?apiid=maps_android_backend&keyType=CLIENT_SIDE_ANDROID&r=5F:28:A4:CD:C1:9D:A8:5A:98:1F:29:B2:4A:7A:96:0F:43:D6:3E:96%3Bcom.google.codelab.usemap
API 키를 가져옵니다.(Google 계정을 사용해야 함)

여기에 이번에 제작한 프로젝트를 추가한다.

그리고 왼쪽 메뉴에서 인증 정보를 선택하여 인증 정보를 만듭니다.위에서 말한 바와 같이 만든 키는 방금 만든 google_maps_api.xmlYOUR_KEY_HERE 에 붙여 넣을 것입니다.
라이브러리 가져오기
키 생성 및 설정이 완료되면 라이브러리를 가져옵니다.
gradle의
build.gradle
implementation 'com.google.android.gms:play-services-maps:17.0.0'
dependencies에 추가합니다.
매핑 설정
  • Activity 제작
    호출된 세션의 Activity를 만듭니다.
  • MainActivity.kt
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            supportFragmentManager
                .beginTransaction()
                .replace(R.id.activity_main, MapFragment())
                .commit()
        }
    }
    
    2. Fragment의 제작
    MapFragment.kt
    class MapFragment : Fragment(), OnMapReadyCallback {
        private lateinit var mMap: GoogleMap
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            requireActivity().setTitle(R.string.map_list)
        }
    
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.fragment_map, container, false)
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            val mapFragment =
                childFragmentManager.findFragmentById(R.id.fragment_map) as SupportMapFragment
            mapFragment.getMapAsync(this)
        }
    
        override fun onMapReady(googleMap: GoogleMap) {
            mMap = googleMap
        }
    }
    
    fragment_map.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=".fragment.MapFragment">
    
        <androidx.fragment.app.FragmentContainerView xmlns:map="http://schemas.android.com/apk/res-auto"
            android:id="@+id/fragment_map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".fragment.MapFragment"
            map:cameraZoom="15.0"
            map:layout_constraintTop_toTopOf="parent"
            map:layout_constraintBottom_toBottomOf="parent"
            map:layout_constraintEnd_toEndOf="parent"
            map:layout_constraintEnd_toStartOf="parent"/>
    
    </FrameLayout>
    
    기본 설치와 Activity는 다릅니다.
    Activity를 구현할 때와 달리 Fragment는 준비onViewCreated()를 하고 맵의 Fragment를 호출해야 한다.onCreateView()에서 호출된 Fragment의 View를 그린 후 Fragment에 설정된 맵의 Fragment("@+id/fragment map")를 생성해야 합니다.
    참고 문장
    https://qiita.com/unpi/items/07592c2643d655ec51a2
    https://teratail.com/questions/265715
    위치 정보를 얻고 싶은데 길어질 수도 있으니까 포기하고...

    좋은 웹페이지 즐겨찾기