在 Android 片段中使用谷歌地图

Posted

技术标签:

【中文标题】在 Android 片段中使用谷歌地图【英文标题】:Using Google Maps in Android Fragment 【发布时间】:2020-12-21 01:19:29 【问题描述】:

我正在开发一个使用 Zomato Api 来获取附近餐馆的应用程序。我有这个片段向用户显示点击餐厅的详细信息。我的目标是在地图上显示餐厅的位置,但我在执行此操作时遇到了问题,因为我遇到了错误。它只在活动中有效吗?我是否必须将层次结构更改为 FragmentActivity?

我的片段

public class RestaurantDetails extends Fragment implements onMapReadyCallback
    private final String APIKEY="75be9f9e2239fe637bf9cb1b46979d91";
    private SupportMapFragment mMapFragment;
    private GoogleMap mGoogleMap;

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        View mContentView = inflater.inflate(R.layout.restaurant_details, container,false);
        int id= Integer.parseInt(getArguments().getString("id"));
        mMapFragment=getSupportFragmentManager().findFragmentById(R.id.map);
        mMapFragment.getMapAsync(this);

        getDetails(id);

        return mContentView;
    

    @Override
    public void onMapReady(GoogleMap googleMap)
        mGoogleMap=googleMap;
    

    private void getDetails(int id) 
                    getApi().getRestaurantDetails(id, APIKEY)
                            .enqueue(new Callback<Restaurant_>() 
                                @Override
                                public void onResponse(Call<Restaurant_> call, Response<Restaurant_> response) 
                         
                                    addMarker( Double.parseDouble(response.body().getLocation().getLatitude()), Double.parseDouble(response.body().getLocation().getLongitude()),
                                            response.body().getName());
                                

                                @Override
                                public void onFailure(Call<Restaurant_> call, Throwable t) 
                                    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                                    builder.setMessage("Couldn´t load restaurant details");
                                    AlertDialog mDialog = builder.create();
                                    mDialog.show();
                                
                            );
                

    private void addMarker(double lat,double lon,String restaurantName)
        LatLng latLng=new LatLng(lat,lon);
        Marker marker=mGoogleMap.addMarker(new MarkerOptions()
                .position(latLng)
                .title(restaurantName));
    

    private Retrofit getRetrofit() 
        return new Retrofit.Builder()
                .baseUrl("https://developers.zomato.com/api/v2.1/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    

    private ZomatoApi getApi() 
        return getRetrofit().create(ZomatoApi.class);
    
    

我得到的错误是:

public class RestaurantDetails extends Fragment implements onMapReadyCallback
mMapFragment=getSupportFragmentManager().findFragmentById(R.id.map);
mMapFragment.getMapAsync(this);

【问题讨论】:

【参考方案1】:

您的mMapFragment 可能为空。确保它不为空。如果是 this link 可能会有所帮助。

【讨论】:

那里发生了 NullPointerException。您的日志指向您错误所在的位置。 mMapFragment 位于 RestaurantDetails 片段中,这就是为什么它会告诉您要查看哪个文件。一旦你处理了 NullPointerException 其他错误就会消失。 对不起,我真的不明白......我什至无法实现接口 如果是关于实现接口只需按 CTRL + I 并选择您应该覆盖的接口。

以上是关于在 Android 片段中使用谷歌地图的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图在片段android

带有标记的Android谷歌地图片段

谷歌地图在Android的标签片段上显示为灰色

getSupportFragmentManager().findFragmentById 为 android 片段中的谷歌地图返回 null?

谷歌地图Android片段崩溃

如何在滚动视图中设置谷歌地图片段