google maps - NullPointerException error, in android.text.Editable android.widget.EditText.getText() -
i developing android apps. had problem. implemented 2 fragments in floating bar. , each floating bar button connected moving map , print listing. when clicked going map, print google maps normally. , in state, press button move home screen in smartphone. , when run app, print google map. but, in stae, if clicked on google location search @ top in application, app crash...
the error message follows: 08-20 09:56:48.698 16761-16761/songjong.com.seongnamgiftcard e/androidruntime: fatal exception: main process: songjong.com.seongnamgiftcard, pid: 16761 java.lang.nullpointerexception: attempt invoke virtual method 'android.text.editable android.widget.edittext.gettext()' on null object reference @ com.google.android.gms.location.places.ui.placeautocompletefragment.zzwc(unknown source) @ com.google.android.gms.location.places.ui.placeautocompletefragment.zzb(unknown source) @ com.google.android.gms.location.places.ui.zzc.onclick(unknown source) @ android.view.view.performclick(view.java:6261) @ android.widget.textview.performclick(textview.java:11159) @ android.view.view$performclick.run(view.java:23752) @ android.os.handler.handlecallback(handler.java:751) @ android.os.handler.dispatchmessage(handler.java:95) @ android.os.looper.loop(looper.java:154) @ android.app.activitythread.main(activitythread.java:6776) @ java.lang.reflect.method.invoke(native method) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1496) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:1386)
xml code :
<android.support.v7.widget.cardview xmlns:card_view="http://schemas.android.com/apk/res-auto" android:name="@+id/card_view" android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="center" card_view:cardcornerradius="4dp" android:layout_alignparenttop="true" android:layout_alignparentleft="true" android:layout_alignparentstart="true"> <fragment android:id="@+id/place_autocomplete_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.google.android.gms.location.places.ui.placeautocompletefragment"> </fragment> </android.support.v7.widget.cardview>
googlemapfragment.java
import android.manifest; import android.content.pm.packagemanager; import android.location.location; import android.os.build; import android.os.bundle; import android.support.annotation.nonnull; import android.support.annotation.nullable; import android.support.v4.app.activitycompat; import android.support.v4.app.fragment; import android.support.v4.app.fragmentmanager; import android.support.v4.app.fragmenttransaction; import android.support.v4.content.contextcompat; import android.util.log; import android.view.inflateexception; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.autocompletetextview; import com.google.android.gms.common.connectionresult; import com.google.android.gms.common.api.googleapiclient; import com.google.android.gms.common.api.pendingresult;ac import com.google.android.gms.common.api.resultcallback; import com.google.android.gms.common.api.status; import com.google.android.gms.location.locationlistener; import com.google.android.gms.location.locationrequest; import com.google.android.gms.location.locationservices; import com.google.android.gms.location.places.place; import com.google.android.gms.location.places.placelikelihood; import com.google.android.gms.location.places.placelikelihoodbuffer; import com.google.android.gms.location.places.places; import com.google.android.gms.location.places.ui.placeautocompletefragment; import com.google.android.gms.location.places.ui.placeselectionlistener; import com.google.android.gms.maps.cameraupdatefactory; import com.google.android.gms.maps.googlemap; import com.google.android.gms.maps.mapview; import com.google.android.gms.maps.mapsinitializer; import com.google.android.gms.maps.onmapreadycallback; import com.google.android.gms.maps.supportmapfragment; 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 songjong.com.seongnamgiftcard.mainactivity; import songjong.com.seongnamgiftcard.r; import static songjong.com.seongnamgiftcard.mainactivity.appaddress; /** * created dongwook on 2017. 8. 9.. */ public class googlemapfragment extends fragment implements onmapreadycallback, googleapiclient.connectioncallbacks, googleapiclient.onconnectionfailedlistener,locationlistener{ private static final latlng default_location = new latlng(37.56, 126.97); private static final string tag = "googlemap"; private static final int gps_enable_request_code = 2001; private static final int permissions_request_access_fine_location = 2002; private static final int update_interval_ms = 15000; private static final int fastest_update_interval_ms = 15000; private googlemap googlemap = null; private mapview mapview = null; private googleapiclient googleapiclient = null; private marker currentmarker = null; private final static int maxentries = 5; private string[] likelyplacenames = null; private string[] likelyaddresses = null; private string[] likelyattributions = null; private latlng[] likelylatlngs = null; public placeautocompletefragment autocompletefragment; private static int searchcnt=0; private static view layout; public void setcurrentlocation(location location, string markertitle, string markersnippet) { log.i(tag, "setcurrentlocation()"); if ( currentmarker != null ) currentmarker.remove(); if (location != null) { //현재위치의 위도 경도 가져옴 log.d(tag,"location!=null"); latlng currentlocation = new latlng( location.getlatitude(), location.getlongitude()); markeroptions markeroptions = new markeroptions(); markeroptions.position(currentlocation); markeroptions.title(markertitle); markeroptions.snippet(markersnippet); markeroptions.draggable(true); markeroptions.icon(bitmapdescriptorfactory.defaultmarker(bitmapdescriptorfactory.hue_blue)); currentmarker = this.googlemap.addmarker(markeroptions); this.googlemap.movecamera(cameraupdatefactory.newlatlng(currentlocation)); return; } log.d(tag,"location==null"); markeroptions markeroptions = new markeroptions(); markeroptions.position(default_location); markeroptions.title(markertitle); markeroptions.snippet(markersnippet); markeroptions.draggable(true); markeroptions.icon(bitmapdescriptorfactory.defaultmarker(bitmapdescriptorfactory.hue_red)); currentmarker = this.googlemap.addmarker(markeroptions); this.googlemap.movecamera(cameraupdatefactory.newlatlng(default_location)); } @override public void oncreate(@nullable bundle savedinstancestate) { log.i(tag, "oncreate()"); super.oncreate(savedinstancestate); googleapiclient = new googleapiclient.builder(getactivity()) .enableautomanage(getactivity() /* fragmentactivity */, /* onconnectionfailedlistener */) .addconnectioncallbacks(this) .addapi(locationservices.api) .addapi(places.geo_data_api) .addapi(places.place_detection_api) .build(); googleapiclient.connect(); } @nullable @override public view oncreateview(layoutinflater inflater, @nullable viewgroup container, @nullable bundle savedinstancestate) { log.i(tag, "oncreateview()"); if(layout==null){ try { layout = inflater.inflate(r.layout.map_fragment, container, false); }catch(inflateexception e){} } mapview = (mapview)layout.findviewbyid(r.id.map); mapview.getmapasync(this); return layout; } //duplicated id 해결 코드 public void onviewcreated(view view, @nullable bundle savedinstancestate) { log.i(tag, "onviewcreated()"); super.onviewcreated(view, savedinstancestate); log.d(tag,"viewcreated"); searchcnt=0; fragmentmanager fm = getchildfragmentmanager(); supportmapfragment mapfragment = (supportmapfragment) fm.findfragmentbytag("mapfragment"); if (mapfragment == null) { mapfragment = new supportmapfragment(); fragmenttransaction ft = fm.begintransaction(); ft.add(r.id.mapfragmentcontainer, mapfragment, "mapfragment"); ft.commit(); fm.executependingtransactions(); } mapfragment.getmapasync(this); } @override public void onstart() { log.i(tag, "onstart()"); super.onstart(); mapview.onstart(); } @override public void onstop() { log.i(tag, "onstop()"); super.onstop(); mapview.onstop(); if (googleapiclient != null && googleapiclient.isconnected()){ googleapiclient.disconnect(); log.d("tag","api null"); } } @override public void onsaveinstancestate(bundle outstate) { log.i(tag, "onsaveinstancestate()"); super.onsaveinstancestate(outstate); mapview.onsaveinstancestate(outstate); } @override public void onresume() { log.i(tag, "onresume()"); super.onresume(); mapview.onresume(); if ( googleapiclient != null) googleapiclient.connect(); } @override public void onpause() { log.i(tag, "onpause()"); super.onpause(); mapview.onpause(); if ( googleapiclient != null && googleapiclient.isconnected()) { locationservices.fusedlocationapi.removelocationupdates(googleapiclient, this); googleapiclient.disconnect(); } //지도 fragment 두번 들어왔을경우 터지는 에러 코드 수정 googleapiclient.stopautomanage(getactivity()); googleapiclient.disconnect(); } @override public void onlowmemory() { log.i(tag, "onlowmemory()"); super.onlowmemory(); mapview.onlowmemory(); } @override public void ondestroy() { log.i(tag, "ondestroy()"); super.ondestroy(); mapview.onlowmemory(); if (googleapiclient != null ) { googleapiclient.unregisterconnectioncallbacks(this); googleapiclient.unregisterconnectionfailedlistener(this); if (googleapiclient.isconnected()) { locationservices.fusedlocationapi.removelocationupdates(googleapiclient, this); googleapiclient.disconnect(); } } } @override public void onactivitycreated(@nullable bundle savedinstancestate) { log.i(tag, "onactivitycreated()"); super.onactivitycreated(savedinstancestate); mapsinitializer.initialize(getactivity().getapplicationcontext()); autocompletefragment = (placeautocompletefragment) getactivity().getfragmentmanager().findfragmentbyid(r.id.place_autocomplete_fragment); try{ autocompletefragment.setonplaceselectedlistener(new placeselectionlistener() { @override public void onplaceselected(place place) { log.i(tag, "onplaceselected()"); log.d(tag,"해당위치로 이동"); location location = new location(""); location.setlatitude(place.getlatlng().latitude); location.setlongitude(place.getlatlng().longitude); setcurrentlocation(location, place.getname().tostring(), place.getaddress().tostring()); appaddress=place.getaddress().tostring(); mainactivity mainactivity = (mainactivity)getactivity(); mainactivity.updatecurrentplacetext(appaddress); } @override public void onerror(status status) { log.i(tag, "an error occurred: " + status); } });}catch(nullpointerexception e){} if(mapview != null) { mapview.oncreate(savedinstancestate); } } @override public void onmapready(googlemap googlemap) { log.i(tag, "onmapready()"); // onmapreadycallback implements 해야 mapview.getmapasync(this); 사용가능. 가 onmapreadycallback this.googlemap = googlemap; //런타임 퍼미션 요청 대화상자나 gps 활성 요청 대화상자 보이기전에 지도의 초기위치를 서울로 이동 setcurrentlocation(null, "위치정보 가져올 수 없음", "위치 퍼미션과 gps 활성 여부 확인"); //나침반이 나타나도록 설정 googlemap.getuisettings().setcompassenabled(true); // 매끄럽게 이동함 googlemap.animatecamera(cameraupdatefactory.zoomto(15)); // api 23 이상이면 런타임 퍼미션 처리 필요 if (build.version.sdk_int >= build.version_codes.m) { // 사용권한체크 int hasfinelocationpermission = contextcompat.checkselfpermission(getactivity(), manifest.permission.access_fine_location); if ( hasfinelocationpermission == packagemanager.permission_denied) { //사용권한이 없을경우 //권한 재요청 activitycompat.requestpermissions(getactivity(), new string[]{manifest.permission.access_fine_location}, permissions_request_access_fine_location); } else { //사용권한이 있는경우 if ( googleapiclient == null) { buildgoogleapiclient(); } if ( activitycompat.checkselfpermission(getactivity(), manifest.permission.access_fine_location) == packagemanager.permission_granted) { googlemap.setmylocationenabled(true); } } } else { if ( googleapiclient == null) { buildgoogleapiclient(); } googlemap.setmylocationenabled(true); } } private void buildgoogleapiclient() { log.i(tag, "buildgoogleapiclient()"); googleapiclient = new googleapiclient.builder(getactivity()) .addconnectioncallbacks(this) .addonconnectionfailedlistener(this) .addapi(locationservices.api) .addapi(places.geo_data_api) .addapi(places.place_detection_api) .enableautomanage(getactivity(), this) .build(); googleapiclient.connect(); } @override public void onconnected(@nullable bundle bundle) { log.i(tag, "onconnected()"); locationrequest locationrequest = new locationrequest(); locationrequest.setpriority(locationrequest.priority_high_accuracy); locationrequest.setinterval(update_interval_ms); locationrequest.setfastestinterval(fastest_update_interval_ms); if ( build.version.sdk_int >= build.version_codes.m) { if ( activitycompat.checkselfpermission(getactivity(), manifest.permission.access_fine_location) == packagemanager.permission_granted) { locationservices.fusedlocationapi .requestlocationupdates(googleapiclient, locationrequest, this); } } else { locationservices.fusedlocationapi .requestlocationupdates(googleapiclient, locationrequest, this); this.googlemap.getuisettings().setcompassenabled(true); this.googlemap.animatecamera(cameraupdatefactory.zoomto(15)); } } @override public void onconnectionsuspended(int cause) { log.i(tag, "onconnectionsuspended()"); if ( cause == cause_network_lost ) log.e(tag, "onconnectionsuspended(): google play services " + "connection lost. cause: network lost."); else if (cause == cause_service_disconnected ) log.e(tag,"onconnectionsuspended(): google play services " + "connection lost. cause: service disconnected"); } @override public void onconnectionfailed(@nonnull connectionresult connectionresult) { log.i(tag, "onconnectionfailed()"); location location = new location(""); location.setlatitude(default_location.latitude); location.setlongitude((default_location.longitude)); setcurrentlocation(location, "위치정보 가져올 수 없음", "위치 퍼미션과 gps활성 여부 확인"); } @override public void onlocationchanged(location location) { log.i(tag, "onlocationchanged()"); if(searchcnt==0){ searchcurrentplaces(); searchcnt++; } } public void searchcurrentplaces() { log.i(tag, "searchcurrentplaces()"); @suppresswarnings("missingpermission") pendingresult<placelikelihoodbuffer> result = places.placedetectionapi .getcurrentplace(googleapiclient, null); result.setresultcallback(new resultcallback<placelikelihoodbuffer>(){ @override public void onresult(placelikelihoodbuffer likelyplaces) { log.i(tag, "currentplaces"); int = 0; likelyplacenames = new string[maxentries]; likelyaddresses = new string[maxentries]; likelyattributions = new string[maxentries]; likelylatlngs = new latlng[maxentries]; log.i(tag, "1"); log.i(tag,""+likelyplaces); for(placelikelihood placelikelihood : likelyplaces) { log.i(tag, string.format("place '%s' has likelihood: %g",placelikelihood.getplace().getname(), placelikelihood.getlikelihood())); likelyplacenames[i] = (string) placelikelihood.getplace().getname(); likelyaddresses[i] = (string) placelikelihood.getplace().getaddress(); likelyattributions[i] = (string) placelikelihood.getplace().getattributions(); likelylatlngs[i] = placelikelihood.getplace().getlatlng(); log.i(tag, "2"); i++; if(i > maxentries - 1 ) { break; } } likelyplaces.release(); location location = new location(""); location.setlatitude(likelylatlngs[0].latitude); location.setlongitude(likelylatlngs[0].longitude); setcurrentlocation(location, likelyplacenames[0], likelyaddresses[0]); } }); } public void ondestroyview() { log.d(tag,"ondestroyview()"); super.ondestroyview(); if(layout!=null) { viewgroup parent = (viewgroup) layout.getparent(); if (parent != null) { parent.removeview(layout); } } } }
i appreciate if let me know how fix it.
Comments
Post a Comment