I have navigationdrawer (menu slider) that gives you places from the google api.
When you select some place of the drawerlist the map should be replaced for a new one. The map is defined on an xml.
The issue is that when it is replaced on the second time, it brings the fragment in blank....At third time it is well replaced (?). I need that if every time I select a new place the map succeds the replace method , not at third time.
When it is replaced on second time it goes to the inflate exception.... checking many answers told that the method I´ve added for the validation for view should work.... but it doesnt. Also the method on destroyView.. it´s like that method is not removing the fragment not well..
Here is my map fragment places:
package google.Bi;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.json.JSONObject;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener;
import com.google.android.gms.maps.GoogleMapOptions;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.Toast;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.ViewGroup;
import android.widget.TextView;
import android.app.AlertDialog;
import android.app.Service;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
import android.app.Dialog;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
public class mapfragmentplaces extends Fragment implements LocationListener, OnClickListener {
protected LocationManager locationManager;
// GoogleMap googleMap;
LatLng myPosition;
private SupportMapFragment map;
private GoogleMap mMapView;
int fragVal2;
static Context ontext;
private static View view;
//lo que se ocupa para construir los sitios
String[] mPlaceType=null;
String[] mPlaceTypeName=null;
double mLatitude=0;
double mLongitude=0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//setSpinnerContent( view );
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
view = null;
}
}
try {
view = inflater.inflate(R.layout.fragment_layout, container, false);
final List<String> list=new ArrayList<String>();
list.add("Nuevo Leon");
final List<String> list2=new ArrayList<String>();
list2.add("Monterrey");
final List<String> list3=new ArrayList<String>();
list3.add("Plaza Fiesta Anahuac");
//final String[] str={"Report 1","Report 2","Report 3","Report 4","Report 5"};
final Spinner sp1= (Spinner) view.findViewById(R.id.Spinner01);
final Spinner sp3= (Spinner) view.findViewById(R.id.Spinner02);
final Spinner sp2= (Spinner) view.findViewById(R.id.Spinner03);
ArrayAdapter<String> adp1=new ArrayAdapter<String>(this.getActivity(),
android.R.layout.simple_list_item_1,list);
adp1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp1.setAdapter(adp1);
ArrayAdapter<String> adp2=new ArrayAdapter<String>(this.getActivity(),
android.R.layout.simple_spinner_item,list2);
adp2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp2.setAdapter(adp2);
ArrayAdapter<String> adp3=new ArrayAdapter<String>(this.getActivity(),
android.R.layout.simple_spinner_item,list3);
adp3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp3.setAdapter(adp3);
Button b = (Button) view.findViewById(R.id.button);
b.getBackground().setAlpha(75);
b.setOnClickListener(this);
android.support.v4.app.FragmentManager fm = getFragmentManager();
map = (SupportMapFragment) fm.findFragmentById(R.id.map);
if (map == null) {
map = SupportMapFragment.newInstance();
fm.beginTransaction().replace(R.id.map, map).commit();
}
mMapView = map.getMap();
Double Lat10 = 25.751188242782035;
Double Lng10 = -100.3097140789032;
LatLng latLng5 = new LatLng(Lat10, Lng10);
mMapView.moveCamera(CameraUpdateFactory.newLatLng(latLng5));
mMapView.animateCamera(CameraUpdateFactory.zoomTo(12));
// Enabling MyLocation Layer of Google Map
mMapView.setMyLocationEnabled(true);
// Getting LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Getting the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Getting Current Location From GPS
Location location = locationManager.getLastKnownLocation(provider);
if(location!=null){
onLocationChanged(location);
}
locationManager.requestLocationUpdates(provider, 20000, 0, this);
// Clears all the existing markers
mMapView.clear();
final String Lugar = "Plaza fiesta";
String Desc = "Lugar bonito";
Double Lat3 = 25.751188242782035;
Double Lng3 = -100.3097140789032;
// notificacion(Results.toString());
mMapView.addMarker(new MarkerOptions()
.position(new LatLng(Lat3,Lng3))
.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker1))
.title(Lugar)
.snippet(Desc));
/* mMapView.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
Intent intent = new Intent(getActivity(), Stores.class);
startActivity(intent);
}
}); */
mMapView.setOnMarkerClickListener(new OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
// TODO Auto-generated method stub
Intent intent2 = null;
if(marker.getTitle().equals(Lugar)) // if marker source is clicked
{ intent2 = new Intent(getActivity(), Stores2.class);
startActivity(intent2);
} else
{
marker.showInfoWindow();
}
return true;
}
});
List<HashMap<String, String>> list5 = setPlaceTag.getList();
String we[] = setPlaceTag.getFinals2();
String we2[] = setPlaceTag.getFinals3();
LatLng we3[] = setPlaceTag.getFinals4();
if (list5!=null){
//((Menu) map).clear();
for(int i=0;i<list5.size();i++){
// Creating a marker
MarkerOptions markerOptions = new MarkerOptions();
// Getting a place from the places list
HashMap<String, String> hmPlace = list5.get(i);
// Getting latitude of the place
double lat = Double.parseDouble(hmPlace.get("lat"));
// Getting longitude of the place
double lng = Double.parseDouble(hmPlace.get("lng"));
// Getting name
String name = hmPlace.get("place_name");
// Getting vicinity
String vicinity = hmPlace.get("vicinity");
LatLng latLng = new LatLng(lat, lng);
// Setting the position for the marker
markerOptions.position(latLng);
// Setting the title for the marker.
//This will be displayed on taping the marker
markerOptions.title(name + " : " + vicinity);
if( we[setPlaceTag.getPosition()].equals(name) && we2[setPlaceTag.getPosition()].equals(vicinity)
&& we3[setPlaceTag.getPosition()].equals(latLng)){
markerOptions.position(latLng).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
}
// Placing a marker on the touched position
mMapView.addMarker(markerOptions);
}
}
} catch (InflateException e) {
/* map is already there, just return view as it is */
}
/*if(anterior!=actual){
Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));
getFragmentManager().beginTransaction().remove(fragment).commit();
} */
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
Double Lat3 = 25.751188242782035;
Double Lng3 = -100.3097140789032;
LatLng latLng100 = new LatLng(Lat3, Lng3);
mMapView.moveCamera(CameraUpdateFactory.newLatLng(latLng100));
mMapView.animateCamera(CameraUpdateFactory.zoomTo(12));
break;
}
}
@Override
public void onLocationChanged(Location location) {
// mLatitude = location.getLatitude();
// mLongitude = location.getLongitude();
// LatLng latLng15 = new LatLng(mLatitude, mLongitude);
/* Double Lat3 = 25.751188242782035;
Double Lng3 = -100.3097140789032;
LatLng latLng = new LatLng(Lat3, Lng3);
mMapView.moveCamera(CameraUpdateFactory.newLatLng(latLng));
mMapView.animateCamera(CameraUpdateFactory.zoomTo(12));*/
}
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onDestroyView() {
super.onDestroyView();
map = SupportMapFragment.newInstance();
Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));
if (fragment != null){
getFragmentManager().beginTransaction().remove(fragment).commit();
}
}
}
Here is my method in main activity to replace it:
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Currently selected item in spinner first is airport!!!
mTitle = setPlaceTag.getTag() ;
setPlaceTag.setPosition(position - 1);
// Creating a fragment object
mapfragmentplaces rFragment = new mapfragmentplaces();
// Getting reference to the FragmentManager
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
// Creating a fragment transaction
android.support.v4.app.FragmentTransaction ft = fragmentManager.beginTransaction();
// Adding a fragment to the fragment transaction
ft.replace(R.id.content_frame, rFragment);
// Committing the transaction
ft.commit();
// Closing the drawer
mDrawerLayout.closeDrawer(mDrawerList);
}
}
Map xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
<!-- <FrameLayout
android:id="@+id/mapFragmentHole"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="60dp"
android:layout_gravity="center_vertical|center_horizontal" /> -->
<TextView
android:id="@+id/tv_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:textSize="40sp"
/>
<Spinner
android:id="@+id/Spinner01"
android:layout_width="146dp"
android:layout_height="34dp"
android:layout_marginLeft="14dp"
android:layout_marginTop="30dp"
android:drawSelectorOnTop="true" />
<Spinner
android:id="@+id/Spinner02"
android:layout_width="146dp"
android:layout_height="34dp"
android:layout_alignLeft="@+id/Spinner03"
android:layout_below="@+id/Spinner03" />
<Spinner
android:id="@+id/Spinner03"
android:layout_width="146dp"
android:layout_height="34dp"
android:layout_alignLeft="@+id/Spinner01"
android:layout_below="@+id/Spinner01" />
<Button
android:id="@+id/button"
style="@style/CustomStyleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/Spinner02"
android:layout_below="@+id/Spinner02"
android:text="Go" />
</RelativeLayout>
I already did the answers in this question:
Error inflating class fragment - duplicate id/illegalargumentexception?
But none works.... anyone could help? ... thanks.