📜  如何在 Android 的 Fragment 中实现谷歌地图?

📅  最后修改于: 2022-05-13 01:55:09.030000             🧑  作者: Mango

如何在 Android 的 Fragment 中实现谷歌地图?

在 Android 中,fragment 是 Activity 的一部分,代表屏幕上用户界面(UI)的一部分。它是 android 活动的模块化部分,对于创建本质上灵活且可根据设备屏幕尺寸自动调整的 UI 设计非常有帮助。所有设备上的 UI 灵活性提高了应用程序的用户体验和适应性。片段只能存在于活动内部,因为它的生命周期取决于宿主活动的生命周期。例如,如果宿主活动暂停,那么与该活动相关的片段的所有方法和操作都将停止运行,因此该片段也称为子活动。可以动态添加、删除或替换片段,即在活动运行时。在本文中,我们将在 Android Studio 的 Fragment 中实现 Google Map。使用它,您将能够在您的 android 应用程序中定位世界上的任何地方。

我们将在本文中构建什么?

这是我们将在本文中构建的示例视频。请注意,我们将使用Java语言制作这个项目。

分步实施

步骤 1. 密钥生成

转到网站 https://mapsplatform.google.com。会出现下图界面。单击创建项目。

如果您正在为个人项目工作,请给您的项目一个合适的名称,并给出组织的名称,然后让它成为无组织。

现在选择 Maps SDK for Android 并点击启用。

转到凭据 > 创建凭据,然后将成功生成 API 密钥。

步骤 2. 创建一个新项目

  • 打开一个新项目。
  • 我们将使用Java语言开发 Empty Activity。保持所有其他选项不变。
  • 在您方便的时候命名应用程序。
  • 将有两个名为 activity_main.xml 和 MainActivity 的默认文件。Java

如果您不知道如何在 Android Studio 中创建新项目,可以参考如何在 Android Studio 中创建/启动新项目?

步骤 3. 添加所需的依赖项

导航到 Gradle scripts > build.gradle(module) 并在其中使用以下依赖项-

implementation 'com.google.android.gms:play-services-maps:17.0.0'

步骤 4. 处理 XML 文件

导航到 app > res > layout > activity_main.xml 并将以下代码添加到该文件。下面是activity_main.xml文件的代码。

XML


  
   
  


XML


  
    
  


XML


    
    
    
    
  
        
        
            
                
  
                
            
        
    
  


Java
package com.example.googlemapinsidefragment;
  
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
  
import android.os.Bundle;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // Initialize fragment
        Fragment fragment=new MapFragment();
  
        // Open fragment
        getSupportFragmentManager()
                .beginTransaction().replace(R.id.frame_layout,fragment)
                .commit();
    }
}


Java
package com.example.googlemapinsidefragment;
  
import android.os.Bundle;
  
import androidx.fragment.app.Fragment;
  
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
  
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
  
public class MapFragment extends Fragment {
  
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Initialize view
        View view=inflater.inflate(R.layout.fragment_map, container, false);
  
        // Initialize map fragment
        SupportMapFragment supportMapFragment=(SupportMapFragment)
                getChildFragmentManager().findFragmentById(R.id.google_map);
  
        // Async map
        supportMapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                // When map is loaded
                googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
                    @Override
                    public void onMapClick(LatLng latLng) {
                        // When clicked on map
                        // Initialize marker options
                        MarkerOptions markerOptions=new MarkerOptions();
                        // Set position of marker
                        markerOptions.position(latLng);
                        // Set title of marker
                        markerOptions.title(latLng.latitude+" : "+latLng.longitude);
                        // Remove all marker
                        googleMap.clear();
                        // Animating to zoom the marker
                        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,10));
                        // Add marker on map
                        googleMap.addMarker(markerOptions);
                    }
                });
            }
        });
        // Return view
        return view;
    }
}


导航到应用程序 > 右键单击 > 新建 > 片段 > 空白片段。将其命名为 MapFragment 并在fragment_map.xml 文件中使用以下代码 -

XML



  
    
  

导航到AndroidManifest.xml文件并在其中使用以下代码 -

XML



    
    
    
    
  
        
        
            
                
  
                
            
        
    
  

步骤 5. 处理Java文件

导航到MainActivity。 Java文件并在其中使用以下代码。代码中添加了注释以便更好地理解。

Java

package com.example.googlemapinsidefragment;
  
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
  
import android.os.Bundle;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // Initialize fragment
        Fragment fragment=new MapFragment();
  
        // Open fragment
        getSupportFragmentManager()
                .beginTransaction().replace(R.id.frame_layout,fragment)
                .commit();
    }
}

导航到MapFragment。 Java文件并在其中使用以下代码。代码中添加了注释以便更好地理解。

Java

package com.example.googlemapinsidefragment;
  
import android.os.Bundle;
  
import androidx.fragment.app.Fragment;
  
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
  
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
  
public class MapFragment extends Fragment {
  
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Initialize view
        View view=inflater.inflate(R.layout.fragment_map, container, false);
  
        // Initialize map fragment
        SupportMapFragment supportMapFragment=(SupportMapFragment)
                getChildFragmentManager().findFragmentById(R.id.google_map);
  
        // Async map
        supportMapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                // When map is loaded
                googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
                    @Override
                    public void onMapClick(LatLng latLng) {
                        // When clicked on map
                        // Initialize marker options
                        MarkerOptions markerOptions=new MarkerOptions();
                        // Set position of marker
                        markerOptions.position(latLng);
                        // Set title of marker
                        markerOptions.title(latLng.latitude+" : "+latLng.longitude);
                        // Remove all marker
                        googleMap.clear();
                        // Animating to zoom the marker
                        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,10));
                        // Add marker on map
                        googleMap.addMarker(markerOptions);
                    }
                });
            }
        });
        // Return view
        return view;
    }
}

这是我们应用程序的最终输出。

输出: