android - Correct and Complete way to add Map in a Fragment which is a part of navigation drawer -
i implemented navigationdrawer latest android upgrade. because of moved entire application different activities different fragment. activities used maps , implemented them using supportmapfragment have changed minimum sdk version , don't need support library more.
so have made 2 fragments extend mapfragment , trying add maps them using fragment in layout , calling fragmentmanager , casting mapfragment followed getmap().
i stuck in null pointer exception , have tried case in map not have loaded. checked if map null. confused , code has become hodgepodge of multiple solutions. can please guide me correct , complete way?
mainactivity.java
public class mainactivity extends activity { private drawerlayout mdrawerlayout; private listview mdrawerlist; private actionbardrawertoggle mdrawertoggle; private charsequence mdrawertitle; private charsequence mtitle; private string[] mplanettitles; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.test_activity); mtitle = mdrawertitle = gettitle(); mplanettitles = getresources().getstringarray(r.array.items_array); mdrawerlayout = (drawerlayout) findviewbyid(r.id.drawer_layout); mdrawerlist = (listview) findviewbyid(r.id.left_drawer); mdrawerlayout.setdrawershadow(r.drawable.drawer_shadow, gravitycompat.start); mdrawerlist.setadapter(new arrayadapter<string>(this, r.layout.drawer_list_item, mplanettitles)); mdrawerlist.setonitemclicklistener(new draweritemclicklistener()); getactionbar().setdisplayhomeasupenabled(true); getactionbar().sethomebuttonenabled(true); mdrawertoggle = new actionbardrawertoggle( this, /* host activity */ mdrawerlayout, /* drawerlayout object */ r.drawable.ic_drawer, /* nav drawer image replace 'up' caret */ r.string.drawer_open, /* "open drawer" description accessibility */ r.string.drawer_close /* "close drawer" description accessibility */ ) { public void ondrawerclosed(view view) { getactionbar().settitle(mtitle); invalidateoptionsmenu(); // creates call onprepareoptionsmenu() } public void ondraweropened(view drawerview) { getactionbar().settitle(mdrawertitle); invalidateoptionsmenu(); // creates call onprepareoptionsmenu() } }; mdrawerlayout.setdrawerlistener(mdrawertoggle); if (savedinstancestate == null) { selectitem(0); } } @override public boolean oncreateoptionsmenu(menu menu) { menuinflater inflater = getmenuinflater(); inflater.inflate(r.menu.main, menu); return super.oncreateoptionsmenu(menu); } /* called whenever call invalidateoptionsmenu() */ @override public boolean onprepareoptionsmenu(menu menu) { // if nav drawer open, hide action items related content view boolean draweropen = mdrawerlayout.isdraweropen(mdrawerlist); menu.finditem(r.id.action_websearch).setvisible(!draweropen); return super.onprepareoptionsmenu(menu); } @override public boolean onoptionsitemselected(menuitem item) { // action bar home/up action should open or close drawer. // actionbardrawertoggle take care of this. if (mdrawertoggle.onoptionsitemselected(item)) { return true; } // handle action buttons switch(item.getitemid()) { case r.id.action_websearch: // create intent perform web search planet intent intent = new intent(intent.action_web_search); intent.putextra(searchmanager.query, getactionbar().gettitle()); // catch event there's no activity handle intent if (intent.resolveactivity(getpackagemanager()) != null) { startactivity(intent); } else { toast.maketext(this, r.string.app_not_available, toast.length_long).show(); } return true; default: return super.onoptionsitemselected(item); } } /* click listner listview in navigation drawer */ private class draweritemclicklistener implements listview.onitemclicklistener { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { selectitem(position); } } private void selectitem(int position) { // update main content replacing fragments fragmentmanager fragmentmanager = getfragmentmanager(); if(position == 0){ fragment pf = new pickupfragment(); fragmentmanager.begintransaction().replace(r.id.content_frame, pf).commit(); } else if(position == 1){ fragment df = new dropfragment(); fragmentmanager.begintransaction().replace(r.id.content_frame, df).commit(); } mdrawerlist.setitemchecked(position, true); settitle(mplanettitles[position]); mdrawerlayout.closedrawer(mdrawerlist); } @override public void settitle(charsequence title) { mtitle = title; getactionbar().settitle(mtitle); } /** * when using actionbardrawertoggle, must call during * onpostcreate() , onconfigurationchanged()... */ @override protected void onpostcreate(bundle savedinstancestate) { super.onpostcreate(savedinstancestate); // sync toggle state after onrestoreinstancestate has occurred. mdrawertoggle.syncstate(); } @override public void onconfigurationchanged(configuration newconfig) { super.onconfigurationchanged(newconfig); // pass configuration change drawer toggls mdrawertoggle.onconfigurationchanged(newconfig); } } one of mapfragments:
public class pickupfragment extends mapfragment { public pickupfragment() { // empty constructor required fragment subclasses } private fragment fragment; static googlemap googlemap; static latlng old_target; static address pickup = new address(new locale("en","india")); static marker pickup_fav; static boolean infowindowistouched; static boolean geocoder_working = false; latlng center; context context; view rootview; mapfragment pickupmapfragment; @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { rootview = inflater.inflate(r.layout.activity_pickup, container, false); return rootview; } @override public void onresume(){ super.onresume(); setupmap(); } private void setupmap() { if (googlemap != null) return; googlemap = pickupmapfragment.getmap(); if (googlemap == null) return; } @override public void onactivitycreated(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); fragmentmanager fm = getfragmentmanager(); pickupmapfragment = (mapfragment)fm.findfragmentbyid(r.id.map_pickup); if (pickupmapfragment == null) { pickupmapfragment = mapfragment.newinstance(); fm.begintransaction().replace(r.id.map_pickup, pickupmapfragment).commit(); } googlemap = pickupmapfragment.getmap(); context = getactivity(); button button = (button) rootview.findviewbyid(r.id.btn_next); button.setbackgroundcolor(color.rgb(4,180,4)); button.setonclicklistener(new view.onclicklistener() { public void onclick(view v) { if(pickup==null || pickup.getmaxaddresslineindex() == -1){ toast.maketext(context, "please select pickup location!", toast.length_short).show(); } else{ string full_address = ""; for(int = 0; < pickup.getmaxaddresslineindex()-1;i++){ full_address += pickup.getaddressline(i); } // toast.maketext(getbasecontext(),address_text , toast.length_short).show(); customaddress c = new customaddress(full_address, double.tostring(pickup.getlatitude()), double.tostring(pickup.getlongitude()) ); intent opendrop = new intent(context, drop.class); opendrop.putextra("pickup_address", c); context.startactivity(opendrop); } } }); textview pickup_address = (textview) rootview.findviewbyid(r.id.tv_pickup); pickup_address.settext(""); googlemap.setmylocationenabled(true); googlemap.movecamera( cameraupdatefactory.newlatlngzoom(new latlng(19.1167, 72.8333),14.0f) ); center = googlemap.getcameraposition().target; googlemap.setoncamerachangelistener(moncamerachangelistener); pickup_fav = googlemap.addmarker(new markeroptions().position(center).title("melbourne").snippet("test"). visible(true).icon(bitmapdescriptorfactory.fromresource(r.drawable.trans))); googlemap.setoninfowindowclicklistener(new googlemap.oninfowindowclicklistener() { @override public void oninfowindowclick(marker marker) { infowindowistouched = true; toast.maketext(context,"info window clicked" + marker.getsnippet() , toast.length_short).show(); dialog dialog = new dialog(context); dialog.setcontentview(r.layout.addbookmark_layout); dialog.setcanceledontouchoutside(true); dialog.show(); // } }); } // asynctask class accessing geocoding web service private class geocodertask extends asynctask<latlng, void, list<address>>{ @override protected list<address> doinbackground(latlng... cur_center) { geocoder geocoder = new geocoder(context); list<address> addresses = null; try { addresses = geocoder.getfromlocation(cur_center[0].latitude,cur_center[0].longitude, 1); } catch (ioexception e) { e.printstacktrace(); } return addresses; } @override protected void onpreexecute(){ geocoder_working = true; // if(mapistouched) // pickup_fav.hideinfowindow(); } @override protected void onpostexecute(list<address> addresses) { if(addresses==null || addresses.size()==0){ toast.maketext(context, "no location found", toast.length_short).show(); } else{ pickup = addresses.get(0); string full_address = ""; for(int = 0; < pickup.getmaxaddresslineindex()-1;i++){ full_address += pickup.getaddressline(i); } textview pickup_address = (textview) rootview.findviewbyid(r.id.tv_pickup); charsequence c = full_address; pickup_address.settext(c); geocoder_working = false; // if (mapistouched) // pickup_fav.hideinfowindow(); old_target = googlemap.getcameraposition().target; } } } private final oncamerachangelistener moncamerachangelistener = new oncamerachangelistener() { @override public void oncamerachange(cameraposition cameraposition) { latlng x = googlemap.getcameraposition().target; new geocodertask().execute(x); pickup_fav.setposition(x); pickup_fav.showinfowindow(); } }; } layout file above mapfragment
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" android:orientation="vertical" tools:context=".pickup" > <relativelayout android:layout_width="match_parent" android:layout_height="wrap_content" > </relativelayout> <framelayout android:id="@+id/content_frame" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <imageview android:id="@+id/img_pickup" android:layout_width="30dp" android:layout_height="48dp" android:layout_gravity="center_vertical" android:paddingleft="4dp" android:paddingright="8dp" android:src="@drawable/from" /> <textview android:id="@+id/tv_pickup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" android:text="medium text" android:textappearance="?android:attr/textappearancemedium" android:textsize="16dp" /> <view android:layout_height="fill_parent" android:layout_width="2dp" android:id="@+id/separator" android:visibility="visible" android:background="@android:color/darker_gray"/> <imageview android:id="@+id/img_pickup_search" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_gravity="right" android:src="@drawable/pickup_search" /> </linearlayout> <view android:layout_width="fill_parent" android:layout_height="0.4dp" android:id="@+id/separator2" android:visibility="visible" android:background="@android:color/darker_gray"/> <framelayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> <framelayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" tools:context=".pickup" > <fragment android:id="@+id/map_pickup" android:layout_width="wrap_content" android:layout_height="wrap_content" class="com.google.android.gms.maps.mapfragment" android:name="com.sharedcab.batchcar.pickup" /> <relativelayout android:layout_width="match_parent" android:layout_height="match_parent"> <imageview android:id="@+id/img_center" android:layout_width="18dp" android:layout_height="32dp" android:layout_centerhorizontal="true" android:layout_centervertical="true" android:src="@drawable/from" /> </relativelayout> </framelayout> <linearlayout android:layout_height="50dp" android:layout_width="match_parent" android:gravity="bottom"> <button android:id="@+id/btn_next" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_margin="0dp" android:layout_weight="1" android:padding="0dp" android:text="next" /> </linearlayout> </linearlayout>
Comments
Post a Comment