1

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.

Community
  • 1
  • 1
arnoldssss
  • 468
  • 3
  • 9
  • 22

0 Answers0