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

Popular posts from this blog

python - How to create a legend for 3D bar in matplotlib? -

java - Multi-Label Document Classification -

php - Dynamic url re-writing using htaccess -