Android App is crashing Tabs and Google Maps -


i using actionbar tabs, there 3 tabs, third tab has google map. when switch between 1st , 3rd, crashes, between 1st , 2nd crashes, between 2nd , 3rd switching never crashes. don't know why happening.

code of mainactivity

package com.example.prototype;   import android.app.actionbar; import android.app.actionbar.tab; import android.app.actionbar.tablistener; import android.app.activity; import android.support.v4.app.fragmentmanager; import android.app.fragmenttransaction; import android.os.bundle; import android.support.v4.app.actionbardrawertoggle; import android.support.v4.app.fragmentactivity; import android.support.v4.view.viewpager; import android.support.v4.view.viewpager.onpagechangelistener; import android.support.v4.widget.drawerlayout; import android.support.v4.widget.drawerlayout.drawerlistener; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.arrayadapter; import android.widget.listview; import android.widget.toast;  public class mainactivity extends fragmentactivity implements actionbar.tablistener  {     tabspageradapter tabpager;     viewpager pager;     drawerlayout drawerlayout;           actionbar action_bar;     listview navigation_list;     @suppresswarnings("deprecation")     actionbardrawertoggle drawertoggle;     string items[];     string tabs_list[]={"best offers","categories","near places"};      protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         setcontentview(r.layout.drawer_layout);         initcomponents();         action_bar=getactionbar();         setnavigationlist();         settabs();     }      @suppresswarnings("deprecation")     private void settabs() {          action_bar.setnavigationmode(actionbar.navigation_mode_tabs);         (string tab_name : tabs_list) {             action_bar.addtab(action_bar.newtab().settext(tab_name)                     .settablistener(this));         }         pager.setadapter(tabpager);         pager.setonpagechangelistener(new onpagechangelistener() {              @override             public void onpageselected(int arg0) {                 // todo auto-generated method stub                 action_bar.setselectednavigationitem(arg0);;             }              @override             public void onpagescrolled(int arg0, float arg1, int arg2) {                 // todo auto-generated method stub              }              @override             public void onpagescrollstatechanged(int arg0) {                 // todo auto-generated method stub              }         });     }      @suppresswarnings("deprecation")     private void setnavigationlist() {          int open=r.string.navigation_open;         int close=r.string.navigation_close;         navigation_list.setadapter(new arrayadapter<string>(this, android.r.layout.simple_list_item_1, items));          drawertoggle=new actionbardrawertoggle(this,drawerlayout, r.drawable.ic_menu_white_18dp,open,close){               public void ondrawerclosed(view view) {                 super.ondrawerclosed(view);                 action_bar.show();             }              public void ondraweropened(view drawerview) {                 super.ondraweropened(drawerview);                 action_bar.hide();              }         };          drawerlayout.setdrawerlistener(drawertoggle);          action_bar.setdisplayhomeasupenabled(true);         action_bar.sethomebuttonenabled(true);      }      @override     protected void onpostcreate(bundle savedinstancestate) {         // todo auto-generated method stub         super.onpostcreate(savedinstancestate);         drawertoggle.syncstate();     }       private void initcomponents() {         // todo auto-generated method stub          drawerlayout=(drawerlayout) findviewbyid(r.id.drawer_layout);         action_bar=getactionbar();         navigation_list=(listview) findviewbyid(r.id.left_drawer);         items=getresources().getstringarray(r.array.navigation_drawer);         pager=(viewpager) findviewbyid(r.id.pager);             fragmentmanager m=getsupportfragmentmanager();         tabpager=new tabspageradapter(m);      }      @override     public boolean oncreateoptionsmenu(menu menu) {         // inflate menu; adds items action bar if present.         getmenuinflater().inflate(r.menu.main, menu);         return true;     }      @override     public boolean onoptionsitemselected(menuitem item) {         // handle action bar item clicks here. action bar         // automatically handle clicks on home/up button, long         // specify parent activity in androidmanifest.xml.         int id = item.getitemid();         if (id == r.id.action_settings) {             return true;         }          if (id == r.id.search_menu) {             toast.maketext(getapplicationcontext(), "searched clicked ", toast.length_long).show();             return true;         }          if (id == r.id.share_menu) {             toast.maketext(getapplicationcontext(), "share clicked ", toast.length_long).show();             return true;         }          if (id == r.id.navigation_menu) {             toast.maketext(getapplicationcontext(), "navigation clicked ", toast.length_long).show();             return true;         }         return super.onoptionsitemselected(item);     }      @override     public void ontabselected(tab tab, fragmenttransaction ft) {         // todo auto-generated method stub         pager.setcurrentitem(tab.getposition());     }      @override     public void ontabunselected(tab tab, fragmenttransaction ft) {         // todo auto-generated method stub      }      @override     public void ontabreselected(tab tab, fragmenttransaction ft) {         // todo auto-generated method stub      }  } 

tab 1 java code:

public class bestofferfragment extends fragment{      view rootview;     @override     public view oncreateview(layoutinflater inflater, viewgroup container,             bundle savedinstancestate) {          rootview = inflater.inflate(r.layout.bestoffer, container, false);      } } 

tab 2 java code:

public class categoriesrfragment extends fragment{     public view oncreateview(layoutinflater inflater, viewgroup container,             bundle savedinstancestate) {          view rootview = inflater.inflate(r.layout.categories, container, false);          return rootview;     } } 

tab 3 java code:

package com.example.prototype.tabs;  import java.util.timer;  import com.example.prototype.mainactivity; import com.example.prototype.r; 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.googlemapoptions; 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.circle; import com.google.android.gms.maps.model.circleoptions; 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.support.v4.app.fragment; import android.support.v4.app.fragmentmanager; import android.app.activity; import android.content.context; import android.graphics.color; import android.location.location; import android.location.locationlistener; import android.location.locationmanager; import android.os.bundle; import android.view.layoutinflater; import android.view.menu; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import android.widget.toast;  public class nearbyplacesfragment extends fragment  implements onmapreadycallback, locationlistener {     static int i=0;     googlemap gmap;     marker mp;     latlng ll;     location l;     context ctx;     double lat,lon;     boolean isgpsenabled,isnetworkavailable,islocationset;     locationmanager lmgr;     long mintime = 1000;     long mindistance = 1;     location loc;     supportmapfragment mapfragment;      public view oncreateview(layoutinflater inflater, viewgroup container,             bundle savedinstancestate) {         ctx=getactivity();         super.oncreateview(inflater, container, savedinstancestate);         if(mapfragment!=null){ toast.maketext(getactivity(), "fragment exist`", 1000).show();}         view rootview = inflater.inflate(r.layout.nearbyplaces, container, false);         loc=getlocation();         if(gmap==null)             setmap();         toast.maketext(getactivity(), "created`", 1000).show();            return rootview;      }       private void setmap() {         // todo auto-generated method stub      mapfragment = (supportmapfragment) getchildfragmentmanager()                 .findfragmentbyid(r.id.map);         mapfragment.getmapasync(this);      }       private void setmarker() {         // todo auto-generated method stub         if(gmap!=null){         lat=loc.getlatitude();         lon=loc.getlongitude();         ll=new latlng(lat, lon);         toast.maketext(getactivity(), "lat"+lat, toast.length_long).show();         mp=gmap.addmarker(new markeroptions().position(ll).title("your location"));         cameraupdate center=cameraupdatefactory.newlatlng(new latlng(lat,lon));         cameraupdate zoom=cameraupdatefactory.zoomto(15);         gmap.movecamera(center);         gmap.animatecamera(zoom);         }     }         @override     public void onmapready(googlemap map) {         // todo auto-generated method stub              map.getuisettings().setallgesturesenabled(true);             map.setmaptype(googlemap.map_type_hybrid);             map.setmylocationenabled(true);             gmap=map;         setmarker();     }        public location getlocation(){          lmgr=(locationmanager) ctx.getsystemservice(context.location_service);          isgpsenabled=lmgr.isproviderenabled(locationmanager.gps_provider);         isnetworkavailable=lmgr.isproviderenabled(locationmanager.network_provider);         if(isgpsenabled==true){             setlocationmanager("gps");         }         else if(isnetworkavailable==true){             setlocationmanager("network");         }          return loc;      }       private boolean setlocationmanager(string s){          if(s.equals("gps")){             toast.maketext(getactivity(), "gps", toast.length_long).show();             lmgr.requestlocationupdates(locationmanager.gps_provider, mintime, mindistance, this);             loc=lmgr.getlastknownlocation(locationmanager.gps_provider);                 }          else{             lmgr.requestlocationupdates(locationmanager.network_provider, mintime, mindistance, this);             loc=lmgr.getlastknownlocation(locationmanager.network_provider);         }          return islocationset;     }        @override     public void onlocationchanged(location location) {      }        @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      }  } 

tab 3 xml:

<?xml version="1.0" encoding="utf-8"?>  <relativelayout android:layout_width="match_parent"      android:layout_height="match_parent"     android:id="@+id/nearbyplace"     xmlns:android="http://schemas.android.com/apk/res/android">      <fragment android:layout_width="match_parent"     android:layout_height="match_parent"     android:id="@+id/map"      android:name="com.google.android.gms.maps.supportmapfragment" />  </relativelayout> 

tabs adapter:

package com.example.prototype;   import com.example.prototype.tabs.bestofferfragment; import com.example.prototype.tabs.categoriesrfragment; import com.example.prototype.tabs.nearbyplacesfragment;  import android.support.v4.app.fragment; import android.support.v4.app.fragmentmanager; import android.support.v4.app.fragmentpageradapter;  public class tabspageradapter extends fragmentpageradapter {     bestofferfragment frag1=new bestofferfragment();     categoriesrfragment frag2=new categoriesrfragment();     nearbyplacesfragment frag3=new nearbyplacesfragment();      public tabspageradapter(fragmentmanager fm) {         super(fm);         // todo auto-generated constructor stub     }      fragment f = null;     @override     public fragment getitem(int index) {          switch (index) {         case 0:              f= frag1; break;          case 1:             f=  frag2; break;         case 2:             // movies fragment activity             f= frag3; break;         }          return f;     }       @override     public int getcount() {         // todo auto-generated method stub         return 3;     }  } 

here log:

07-11 01:49:28.877: e/nativecrypto(7463): ssl=0x616b4438 cert_verify_callback x509_store_ctx=0x6210aab0 arg=0x0 07-11 01:49:28.882: e/nativecrypto(7463): ssl=0x616b4438 cert_verify_callback calling verifycertificatechain authmethod=ecdhe_ecdsa 07-11 01:49:35.046: e/androidruntime(7463): fatal exception: main 07-11 01:49:35.046: e/androidruntime(7463): android.view.inflateexception: binary xml file line #8: error inflating class fragment 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.layoutinflater.createviewfromtag(layoutinflater.java:704) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.layoutinflater.rinflate(layoutinflater.java:746) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.layoutinflater.inflate(layoutinflater.java:489) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.layoutinflater.inflate(layoutinflater.java:396) 07-11 01:49:35.046: e/androidruntime(7463):     @ com.example.prototype.tabs.nearbyplacesfragment.oncreateview(nearbyplacesfragment.java:58) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.app.fragment.performcreateview(fragment.java:1789) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.app.fragmentmanagerimpl.movetostate(fragmentmanager.java:955) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.app.fragmentmanagerimpl.attachfragment(fragmentmanager.java:1314) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.app.backstackrecord.run(backstackrecord.java:730) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.app.fragmentmanagerimpl.execpendingactions(fragmentmanager.java:1501) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.app.fragmentmanagerimpl.executependingtransactions(fragmentmanager.java:490) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.app.fragmentpageradapter.finishupdate(fragmentpageradapter.java:141) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.view.viewpager.populate(viewpager.java:1105) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.view.viewpager.populate(viewpager.java:951) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.view.viewpager$3.run(viewpager.java:250) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.choreographer$callbackrecord.run(choreographer.java:776) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.choreographer.docallbacks(choreographer.java:579) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.choreographer.doframe(choreographer.java:547) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.choreographer$framedisplayeventreceiver.run(choreographer.java:762) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.os.handler.handlecallback(handler.java:725) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.os.handler.dispatchmessage(handler.java:92) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.os.looper.loop(looper.java:153) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.app.activitythread.main(activitythread.java:5297) 07-11 01:49:35.046: e/androidruntime(7463):     @ java.lang.reflect.method.invokenative(native method) 07-11 01:49:35.046: e/androidruntime(7463):     @ java.lang.reflect.method.invoke(method.java:511) 07-11 01:49:35.046: e/androidruntime(7463):     @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:833) 07-11 01:49:35.046: e/androidruntime(7463):     @ com.android.internal.os.zygoteinit.main(zygoteinit.java:600) 07-11 01:49:35.046: e/androidruntime(7463):     @ dalvik.system.nativestart.main(native method) 07-11 01:49:35.046: e/androidruntime(7463): caused by: java.lang.illegalargumentexception: binary xml file line #8: duplicate id 0x7f08006c, tag null, or parent id 0x7f08006b fragment com.google.android.gms.maps.supportmapfragment 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.app.fragmentmanagerimpl.oncreateview(fragmentmanager.java:2175) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.support.v4.view.layoutinflatercompathc$factorywrapperhc.oncreateview(layoutinflatercompathc.java:44) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.layoutinflater$factorymerger.oncreateview(layoutinflater.java:168) 07-11 01:49:35.046: e/androidruntime(7463):     @ android.view.layoutinflater.createviewfromtag(layoutinflater.java:675) 07-11 01:49:35.046: e/androidruntime(7463):     ... 27 more 

the best way make sure don't run error make fragment extend supportmapfragment instead of nesting 1 inside fragment.

i got working using viewpager fragmentpageradapter map 1 of tabs.

here general structure, note there no need override oncreateview() method, , there no need inflate layout xml:

public class mymapfragment extends supportmapfragment implements onmapreadycallback {      private googlemap mmap;     private marker marker;       public mymapfragment() {     }      @override     public void onresume() {         super.onresume();          log.d("mymap", "onresume");         setupmapifneeded();     }      private void setupmapifneeded() {          if (mmap == null) {              log.d("mymap", "setupmapifneeded");              getmapasync(this);         }     }      @override     public void onmapready(googlemap googlemap) {         log.d("mymap", "onmapready");         mmap = googlemap;         setupmap();     }      private void setupmap() {          mmap.setmylocationenabled(true);         mmap.setmaptype(googlemap.map_type_hybrid);         mmap.getuisettings().setmaptoolbarenabled(false);           mmap.setonmapclicklistener(new googlemap.onmapclicklistener() {              @override             public void onmapclick(latlng point) {                  log.d("mymap", "mapclick");                  //remove placed marker                 if (marker != null) {                     marker.remove();                 }                  //place marker user clicked                 marker = mmap.addmarker(new markeroptions().position(point).title("marker")                         .icon(bitmapdescriptorfactory.defaultmarker(bitmapdescriptorfactory.hue_magenta)));                  log.d("mymap", "mapclick after add marker");              }         });      }   } 

result:

enter image description here


Comments