【问题标题】:Using Google Maps in Android Fragment在 Android 片段中使用谷歌地图
【发布时间】: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);

【问题讨论】:

    标签: android google-maps android-fragments zomato-api


    【解决方案1】:

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

    【讨论】:

    • 那里发生了 NullPointerException。您的日志指向您错误所在的位置。 mMapFragment 位于 RestaurantDetails 片段中,这就是为什么它会告诉您要查看哪个文件。一旦你处理了 NullPointerException 其他错误就会消失。
    • 对不起,我真的不明白......我什至无法实现接口
    • 如果是关于实现接口只需按 CTRL + I 并选择您应该覆盖的接口。
    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多