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:

Comments
Post a Comment