gpt4 book ai didi

java - fragment 中未调用 onMapReady

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:01 25 4
gpt4 key购买 nike

我正在构建一个与谷歌地图相关的应用程序。在此我试图在 fragment 中实现 map 。我在 OnMapReady 方法中操作 map 。但是应用程序没有调用 OnMapReady 方法。我在 Activity 中实现了同样的事情并且它的工作完美。但它不是 fragment 化的。我不知道它是否是 fragment 生命周期的问题,我遗漏了一些东西。这是代码。

Maps_Fragment.java

    package com.example.mudasir.login;


import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

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.MapFragment;
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.LatLngBounds;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import java.io.IOException;
import java.util.List;


/**
* A simple {@link Fragment} subclass.
*/
public class Maps_Fragment extends Fragment implements OnMapReadyCallback {

public GoogleMap mMap;
String[] showroom_addresses = new String[5];
List<Address> addressList = null;
LatLng latlng;
LatLngBounds.Builder builder = new LatLngBounds.Builder();
View view1;

public Maps_Fragment() {
// Required empty public constructor
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_maps_, container, false);
}
@Override
public void onViewCreated(View view,Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.maps);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {

showroom_addresses[0] = "Dubai";
showroom_addresses[1] = "Fujairah";
showroom_addresses[2] = "Al Ain";
showroom_addresses[3] = "Sharjah";
showroom_addresses[4] = "Ras Al Khaimah";
Geocoder geocoder = new Geocoder(getActivity());
for(int i =0; i<5; i++) {
try {
addressList = geocoder.getFromLocationName(showroom_addresses[i], 1);
} catch (IOException e) {
e.printStackTrace();
}
android.location.Address address = addressList.get(0);
latlng = new LatLng(address.getLatitude(), address.getLongitude());
Marker marker = googleMap.addMarker(new MarkerOptions().position(latlng).title(showroom_addresses[i]));
builder.include(marker.getPosition());
}

LatLngBounds bounds = builder.build();
int padding = 0;
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds,padding);
//CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(new MarkerOptions().position(latlng).title(showroom_addresses[3]).getPosition(),7F);
googleMap.animateCamera(cu);
}

}

Maps_Fragment.xml

<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="com.example.mudasir.login.Maps_Fragment">

<!-- TODO: Update blank fragment layout -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout">


<fragment android:id="@+id/maps"
android:layout_width="wrap_content"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment"
android:layout_alignParentTop="true">
</fragment>

相同的方法和要求在 Activity 的情况下工作正常,但在 fragment 的情况下出现问题。请帮忙。

最佳答案

你必须扩展自

SupportMapFragment

代替

Fragment

[编辑]

我的建议是使用 2 个 fragment :一个在您没有任何结果时使用,另一个使用 SupportFragmentManager。

此外,在应该从 SupportFragmentManager 扩展的 Maps_Fragment 中,您必须删除 onCreateView 和 onViewCreated 的重写,否则您应该管理所有 SupportMapFragment,我认为您不想这样做。

<strike>    @Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_maps_, container, false);
}
@Override
public void onViewCreated(View view,Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.maps);
mapFragment.getMapAsync(this);
}]
</strike>

要实现 OnMapReadyCallback,我将在 onActivityCreated 方法中执行:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getMapAsync(this);
}

关于java - fragment 中未调用 onMapReady,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39539643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com