android - Updating fragment text view from Activity - Nullpointerexception -
being sort of new in android topic, i've been reading , taking courses/tutorials here , there. understand activity deal i'm fragments , trying put simple app using google calendar api. however, i'm having hard time grasping "updating fragment" mainactivity part.
at point, app crashes i've tried make work have had no success :( how go this??
here's mainactivity:
public class mainactivity extends activity implements navigationdrawerfragment.navigationdrawercallbacks { com.google.api.services.calendar.calendar mservice; googleaccountcredential credential; public textview mstatustext; public textview meventtext; final httptransport transport = androidhttp.newcompatibletransport(); final jsonfactory jsonfactory = gsonfactory.getdefaultinstance(); static final int request_account_picker = 1000; static final int request_authorization = 1001; static final int request_google_play_services = 1002; private static final string pref_account_name = "accountname"; private static final string[] scopes = {calendarscopes.calendar_readonly}; /** * fragment managing behaviors, interactions , presentation of navigation drawer. */ private navigationdrawerfragment mnavigationdrawerfragment; /** * used store last screen title. use in {@link #restoreactionbar()}. */ private charsequence mtitle; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mnavigationdrawerfragment = (navigationdrawerfragment) getfragmentmanager().findfragmentbyid(r.id.navigation_drawer); mtitle = gettitle(); // set drawer. mnavigationdrawerfragment.setup( r.id.navigation_drawer, (drawerlayout) findviewbyid(r.id.drawer_layout)); // initialize credentials , calendar service. sharedpreferences settings = getpreferences(context.mode_private); credential = googleaccountcredential.usingoauth2( getapplicationcontext(), arrays.aslist(scopes)) .setbackoff(new exponentialbackoff()) .setselectedaccountname(settings.getstring(pref_account_name, null)); mservice = new com.google.api.services.calendar.calendar.builder( transport, jsonfactory, credential) .setapplicationname("calendar api android quickstart") .build(); } @override public void onnavigationdraweritemselected(int position) { fragment fragment = null; switch (position) { case 0: fragment = new noticias_fragment(); break; case 1: fragment = new eventos_fragment(); break; case 2: fragment = new quienes_fragment(); break; case 3: fragment = new contacto_fragment(); break; } // update main content replacing fragments fragmentmanager fragmentmanager = getfragmentmanager(); fragmentmanager.begintransaction() .replace(r.id.container, fragment) .commit(); } public void onsectionattached(int number) { switch (number) { case 1: mtitle = getstring(r.string.title_section1); break; case 2: mtitle = getstring(r.string.title_section2); break; case 3: mtitle = getstring(r.string.title_section3); break; case 4: mtitle = getstring(r.string.title_section4); break; } } public void restoreactionbar() { actionbar actionbar = getactionbar(); actionbar.setnavigationmode(actionbar.navigation_mode_standard); actionbar.setdisplayshowtitleenabled(true); actionbar.settitle(mtitle); } @override public boolean oncreateoptionsmenu(menu menu) { if (!mnavigationdrawerfragment.isdraweropen()) { // show items in action bar relevant screen // if drawer not showing. otherwise, let drawer // decide show in action bar. getmenuinflater().inflate(r.menu.main, menu); restoreactionbar(); return true; } return super.oncreateoptionsmenu(menu); } @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; } return super.onoptionsitemselected(item); } /** * placeholder fragment containing simple view. */ public static class placeholderfragment extends fragment { /** * fragment argument representing section number * fragment. */ private static final string arg_section_number = "section_number"; /** * returns new instance of fragment given section * number. */ public static placeholderfragment newinstance(int sectionnumber) { placeholderfragment fragment = new placeholderfragment(); bundle args = new bundle(); args.putint(arg_section_number, sectionnumber); fragment.setarguments(args); return fragment; } public placeholderfragment() { } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view rootview = inflater.inflate(r.layout.fragment_main, container, false); return rootview; } @override public void onattach(activity activity) { super.onattach(activity); ((mainactivity) activity).onsectionattached( getarguments().getint(arg_section_number)); } } public void buttononclick(view v) { switch (v.getid()) { case r.id.imagebutton: //botón mail intent emailintent = new intent(android.content.intent.action_send); emailintent.settype("text/plain"); emailintent.putextra(android.content.intent.extra_email, new string[]{"elmaildefresh@gmail.com"}); emailintent.putextra(android.content.intent.extra_subject, "motivo"); emailintent.putextra(android.content.intent.extra_text, "escribe tu texto enviar"); startactivity(intent.createchooser(emailintent, "elije tu gestor de correo...")); break; case r.id.imagebutton2: //botón página intent intent2 = new intent(intent.action_view); intent2.setdata(uri.parse("http://www.lapaginadelfreshxalapa.com")); startactivity(intent2); break; case r.id.imagebutton3: //botón fb intent intent3 = new intent(intent.action_view); intent3.setdata(uri.parse("http://www.facebook.com/freshxalapa")); startactivity(intent3); break; case r.id.imagebutton4: //botón tw intent intent4 = new intent(intent.action_view); intent4.setdata(uri.parse("http://www.twitter.com/freshxalapa")); startactivity(intent4); break; } } /** * called whenever activity pushed foreground, such after * call oncreate(). */ @override protected void onresume() { super.onresume(); if (isgoogleplayservicesavailable()) { refresheventlist(); } else { mstatustext.settext("google play services required: " + "after installing, close , relaunch app."); } } /** * called when activity launched here (specifically, accountpicker * , authorization) exits, giving requestcode started with, * resultcode returned, , additional data it. * @param requestcode code indicating activity result incoming. * @param resultcode code indicating result of incoming * activity result. * @param data intent (containing result data) returned incoming * activity result. */ @override protected void onactivityresult( int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); switch(requestcode) { case request_google_play_services: if (resultcode == result_ok) { refresheventlist(); } else { isgoogleplayservicesavailable(); } break; case request_account_picker: if (resultcode == result_ok && data != null && data.getextras() != null) { string accountname = data.getstringextra(accountmanager.key_account_name); if (accountname != null) { credential.setselectedaccountname(accountname); sharedpreferences settings = getpreferences(context.mode_private); sharedpreferences.editor editor = settings.edit(); editor.putstring(pref_account_name, accountname); editor.commit(); refresheventlist(); } } else if (resultcode == result_canceled) { mstatustext.settext("account unspecified."); } break; case request_authorization: if (resultcode == result_ok) { refresheventlist(); } else { chooseaccount(); } break; } super.onactivityresult(requestcode, resultcode, data); } /** * attempt list of calendar events display. if email * address isn't known yet, call chooseaccount() method user * can pick account. */ private void refresheventlist() { if (credential.getselectedaccountname() == null) { chooseaccount(); } else { if (isdeviceonline()) { new eventsfetchtask(this).execute(); } else { mstatustext.settext("no network connection available."); } } } /** * clear existing events list display , update header * message; called background threads , async tasks need * update ui (in ui thread). */ public void clearevents() { runonuithread(new runnable() { @override public void run() { mstatustext.settext("retrieving events…"); meventtext.settext(""); } }); } /** * fill event display given list of strings; called * background threads , async tasks need update ui (in * ui thread). * @param eventstrings list of strings populate event display with. */ public void updateeventlist(final list<string> eventstrings) { runonuithread(new runnable() { @override public void run() { if (eventstrings == null) { mstatustext.settext("error retrieving events!"); } else if (eventstrings.size() == 0) { mstatustext.settext("no upcoming events found."); } else { mstatustext.settext("your upcoming events retrieved using" + " google calendar api:"); meventtext.settext(textutils.join("\n\n", eventstrings)); } } }); } /** * show status message in list header textview; called background * threads , async tasks need update ui (in ui thread). * @param message string display in ui header textview. */ public void updatestatus(final string message) { runonuithread(new runnable() { @override public void run() { mstatustext.settext(message); } }); } /** * starts activity in google play services user can pick * account. */ private void chooseaccount() { startactivityforresult( credential.newchooseaccountintent(), request_account_picker); } /** * checks whether device has network connection. * @return true if device has network connection, false otherwise. */ private boolean isdeviceonline() { connectivitymanager connmgr = (connectivitymanager) getsystemservice(context.connectivity_service); networkinfo networkinfo = connmgr.getactivenetworkinfo(); return (networkinfo != null && networkinfo.isconnected()); } /** * check google play services apk installed , date. * launch error dialog user update google play services if * possible. * @return true if google play services available , * date on device; false otherwise. */ private boolean isgoogleplayservicesavailable() { final int connectionstatuscode = googleplayservicesutil.isgoogleplayservicesavailable(this); if (googleplayservicesutil.isuserrecoverableerror(connectionstatuscode)) { showgoogleplayservicesavailabilityerrordialog(connectionstatuscode); return false; } else if (connectionstatuscode != connectionresult.success ) { return false; } return true; } /** * display error dialog showing google play services missing * or out of date. * @param connectionstatuscode code describing presence (or lack of) * google play services on device. */ void showgoogleplayservicesavailabilityerrordialog( final int connectionstatuscode) { runonuithread(new runnable() { @override public void run() { dialog dialog = googleplayservicesutil.geterrordialog( connectionstatuscode, mainactivity.this, request_google_play_services); dialog.show(); } }); } } and here's fragment:
import android.app.fragment; import android.os.bundle; import android.support.annotation.nullable; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.textview; public class eventos_fragment extends fragment { view rootview; /** * calendar service object used query or modify calendars via * calendar api. note: not confuse class * com.google.api.services.calendar.model.calendar class. */ textview mstatustext; textview meventtext; @nullable @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { rootview = inflater.inflate(r.layout.fragment_evento, container, false); //set event text views google api return rootview; } public void changestatustext(){ //this textview should bound in fragment oncreate member variable mstatustext = (textview) rootview.findviewbyid(r.id.status_text_view); mstatustext.settext("estatus"); } public void changeeventtext(){ //this textview should bound in fragment oncreate member variable meventtext = (textview) rootview.findviewbyid(r.id.event_text_view); meventtext.settext("evento"); } } the log:
04-28 18:38:46.751 1557-1557/mx.com.origamilab.fresh e/androidruntime﹕ fatal exception: main process: mx.com.origamilab.fresh, pid: 1557 java.lang.runtimeexception: unable resume activity {mx.com.origamilab.fresh/mx.com.origamilab.fresh.mainactivity}: java.lang.nullpointerexception @ android.app.activitythread.performresumeactivity(activitythread.java:2774) @ android.app.activitythread.handleresumeactivity(activitythread.java:2803) @ android.app.activitythread.handlelaunchactivity(activitythread.java:2238) @ android.app.activitythread.access$800(activitythread.java:135) @ android.app.activitythread$h.handlemessage(activitythread.java:1196) @ android.os.handler.dispatchmessage(handler.java:102) @ android.os.looper.loop(looper.java:136) @ android.app.activitythread.main(activitythread.java:5001) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:515) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:785) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:601) @ dalvik.system.nativestart.main(native method) caused by: java.lang.nullpointerexception @ mx.com.origamilab.fresh.mainactivity.onresume(mainactivity.java:258) @ android.app.instrumentation.callactivityonresume(instrumentation.java:1192) @ android.app.activity.performresume(activity.java:5310) @ android.app.activitythread.performresumeactivity(activitythread.java:2764) at android.app.activitythread.handleresumeactivity(activitythread.java:2803) at android.app.activitythread.handlelaunchactivity(activitythread.java:2238) at android.app.activitythread.access$800(activitythread.java:135) at android.app.activitythread$h.handlemessage(activitythread.java:1196) at android.os.handler.dispatchmessage(handler.java:102) at android.os.looper.loop(looper.java:136) at android.app.activitythread.main(activitythread.java:5001) at java.lang.reflect.method.invokenative(native method) at java.lang.reflect.method.invoke(method.java:515) at com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:785) at com.android.internal.os.zygoteinit.main(zygoteinit.java:601) at dalvik.system.nativestart.main(native method)
try this
replace
fragmentmanager fragmentmanager = getfragmentmanager(); fragmentmanager.begintransaction() .replace(r.id.container, fragment) .commit(); with
android.support.v4.app.fragmentmanager fragmentmanager = getsupportfragmentmanager(); fragmentmanager.begintransaction() .replace(r.id.container, fragment).commit();
Comments
Post a Comment