我尝试使用Firebase Realtime Dataase
访问我的地图标记,其中包括dob
,dod
,name
,{{1 }},latitude
等。我想使用全名作为标记的标题,以及dob和dod作为标记的片段。
我的问题是,不知道如何将longitude
,latitude
的值作为标记的位置以及longitude
和firstname
作为标题...
这是我的lastname
Realtime Dataase
Profile
我的地图应用的代码:
0
dob: "24/12/1940"
dod: "02/07/2016"
firstname:"Lincon"
lastname:"Hall"
latitude: -34.506081
longitude:150.88104
1
dob: "05/06/1949"
dod: "08/08/2016"
firstname:"Ben"
lastname:"Roberts"
latitude:-34.50609
longitude:150.8811
}
任何人都可以帮助我吗?非常感谢!
Dob和dod的值为空。
答案 0 :(得分:3)
尝试以下方法:
创建一个用于存储和检索数据库中标记数据的类。
在这个例子中,我建议你创建一个java对象,用于轻松存储和检索你的标记信息。该类将表示您要用于创建Google Map标记的任何数据。您可以将课程命名为对您有意义的名称。我将在这个例子中将其称为FirebaseMarker。
public class FirebaseMarker {
public String dob;
public String dod;
public String firstname;
public String lastname;
public double latitude;
public double longitude;
//required empty constructor
public FirebaseMarker() {
}
public FirebaseMarker(String firstname, String lastname, double latitude, double longitude, String dob, String dod) {
this.dob = dob;
this.dod = dod;
this.firstname = firstname;
this.lastname = lastname;
this.latitude = latitude;
this.longitude = longitude;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public String getDod() {
return dod;
}
public void setDod(String dod) {
this.dod = dod;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
}
每当您想要将标记信息保存到数据库时,您可以这样做:
DatabaseReference mProfileRef = FirebaseDatabase.getInstance().getReference("Profile");
FirebaseMarker marker = new FirebaseMarker("Lincoln", "Hall", -34.506081, 150.88104, "24/12/1940", "02/07/2016" );
mProfileRef.push().setValue(marker);
将childEventListener移动到onMapReady()
由于您希望访问GoogleMap
最安全的地方childEventListener
对象,因此您可以确定onMapReady
回调中的GoogleMap
回调object不会为null。
使用Firebase数据库中存储的数据将您的代码添加到地图中以添加标记到您的childEventListener的onChildAdded回调
当您将childEventListener
附加到数据库中的某个位置时,将为该位置的每个孩子调用一次onChildAdded
回调,然后每次将新子项添加到该位置时再次调用onChildChanged
回调。现在,用于使用存储在数据库中的信息将标记添加到地图的代码放在OnChildChanged
回调中。 ChildEventListener mChildEventListener;
DatabaseReference mProfileRef = FirebaseDatabase.getInstance().getReference("Profile");
//....
@Override
public void onMapReady(GoogleMap googleMap){
googleMap.setOnMarkerClickListener(this);
LatLng wollongong = new LatLng(-34.404336, 150.881632);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(wollongong, 18));
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
//get marker info from Firebase Database and add to map
addMarkersToMap(googleMap);
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
googleMap.setMyLocationEnabled(true);
}
@Override
public void onStop(){
if(mChildEventListener != null)
mProfileRef.removeEventListener(mChildEventListener);
super.onStop();
}
private void addMarkersToMap(GoogleMap map){
mChildEventListener = mProfileRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
FirebaseMarker marker = dataSnapshot.getValue(FirebaseMarker.class);
String dob = marker.getDob();
String dod = marker.getDod();
String latitude = marker.getLatitude();
String longitude = marker.getLongitude();
String firstname = marker.getFirstname();
String lastname = marker.getLastname();
LatLng location = new LatLng(latitude,longitude);
map.addMarker(new MarkerOptions().position(location).title(firstname,lastname).snippet(dob,dod));
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
仅在更新了附加侦听器的位置的子节点时调用(传递给该侦听器的dataSnapshot是已更改的子节点)。此外,我假设您将使用Java类来存储/检索您的标记信息,如上所述。
@Override
protected void onDraw(Canvas canvas) {
long now = android.os.SystemClock.uptimeMillis();
if (mMovieStart == 0) { // first time
mMovieStart = now;
}
if (gifMovie != null) {
int dur = gifMovie.duration();
if (dur == 0) {
dur = 1000;
}
now = android.os.SystemClock.uptimeMillis();
int relTime = (int) ((now - mMovieStart) % dur);
if (now - mMovieStart > movieDuration) {
relTime = 0;
}
gifMovie.setTime(relTime);
gifMovie.draw(canvas, 0, 0);
invalidate();
}
}