i have 2 fragments, lets call them fragment , fragment b, part of navigationdrawer (this activity bound to). in fragment have button. when button pressed, item added listview in fragment b.
what best way this? use intents, savedpreferences, making public(?) or else?
edit 5: 20/7/13 srains latest code
this navigationdrawer use start fragments:
import android.support.v4.app.fragment; import android.support.v4.app.fragmentactivity; import android.support.v4.app.fragmentmanager; import android.app.service; import android.content.context; import android.content.intent; import android.content.sharedpreferences; import android.content.res.configuration; import android.os.bundle; import android.preference.preferencemanager; import android.support.v4.app.actionbardrawertoggle; import android.support.v4.view.gravitycompat; import android.support.v4.widget.drawerlayout; import android.view.menu; import android.view.menuinflater; import android.view.menuitem; import android.view.view; import android.view.windowmanager; import android.view.inputmethod.inputmethodmanager; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.listview; public class navigation_drawer extends fragmentactivity { public drawerlayout mdrawerlayout; // creates drawerlayout called_. public listview mdrawerlist; public actionbardrawertoggle mdrawertoggle; private charsequence mdrawertitle; private charsequence mtitle; private string[] mnoteractivities; // creates string array called _. @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub // setting navigation drawer } // end of oncreate // removed menu @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { selectitem(position); } } private void selectitem(int position) { fragmentmanager fragmentmanager = getsupportfragmentmanager(); if (position == 0) { fragment qnfragment = new quicknotefragment(); ((fragmentbase) qnfragment).setcontext(this); bundle args = new bundle(); // creates bundle called args args.putint(quicknotefragment.arg_noteractivity_number, position); qnfragment.setarguments(args); fragmentmanager.begintransaction() .replace(r.id.content_frame, qnfragment).commit(); } else if (position == 3) { fragment pendviewpager = new pendviewpager(); // viewpager includes historyfragment ((fragmentbase) pendviewpager).setcontext(this); bundle args = new bundle(); pendviewpager.setarguments(args); fragmentmanager.begintransaction() .replace(r.id.content_frame, pendviewpager).commit(); } // update title etc } @override protected void onpostcreate(bundle savedinstancestate) { // used navdrawer toggle super.onpostcreate(savedinstancestate); // sync toggle state after onrestoreinstancestate has occurred. mdrawertoggle.syncstate(); } @override public void onconfigurationchanged(configuration newconfig) { // used navdrawer toggle super.onconfigurationchanged(newconfig); // pass configuration change drawer toggles mdrawertoggle.onconfigurationchanged(newconfig); } } this quicknotefragment:
import android.support.v4.app.fragment; import android.support.v4.app.fragmentmanager; import android.app.notification; import android.app.notificationmanager; import android.app.pendingintent; import android.content.context; import android.content.intent; import android.content.sharedpreferences; import android.net.uri; import android.os.bundle; import android.preference.preferencemanager; import android.support.v4.app.notificationcompat; import android.view.layoutinflater; import android.view.menu; import android.view.menuinflater; import android.view.menuitem; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup; import android.widget.button; import android.widget.checkbox; import android.widget.edittext; import android.widget.textview; import android.widget.toast; public class quicknotefragment extends fragmentbase implements onclicklistener { public static final string arg_noteractivity_number = "noter_activity"; button b_create; // removed other defining stuff @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view rootview = inflater.inflate(r.layout.quicknote, container, false); int = getarguments().getint(arg_noteractivity_number); string noter_activity = getresources().getstringarray( r.array.noter_array)[i]; fragmentmanager fm = getfragmentmanager(); setretaininstance(true); b_create = (button) rootview.findviewbyid(r.id.qn_b_create); // removed other stuff getactivity().settitle(noter_activity); return rootview; } @override public void onclick(view v) { // todo auto-generated method stub switch (v.getid()) { case r.id.qn_b_create: string data = "string data"; datamodel.getinstance().additem(data); break; } } @override public void oncreateoptionsmenu(menu menu, menuinflater inflater) { // todo auto-generated method stub super.oncreateoptionsmenu(menu, inflater); } @override public boolean onoptionsitemselected(menuitem item) { // handle item selection } } public interface onitemaddedhandler { // srains code public void onitemadded(object data); } } this historyfragment (remember part of viewpager):
import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.map; import com.rithbo.noter.quicknotefragment.onitemaddedhandler; import android.os.bundle; import android.support.v4.app.fragment; import android.view.contextmenu; import android.view.contextmenu.contextmenuinfo; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.adapterview; import android.widget.adapterview.adaptercontextmenuinfo; import android.widget.listview; import android.widget.simpleadapter; import android.widget.textview; import android.widget.toast; public class historyfragment extends fragmentbase implements onitemaddedhandler { listview lv; list<map<string, string>> planetslist = new arraylist<map<string, string>>(); simpleadapter simpleadpt; @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { // todo auto-generated method stub view view = inflater.inflate(r.layout.history, container, false); initlist(); listview lv = (listview) view.findviewbyid(r.id.listview); simpleadpt = new simpleadapter(getactivity(), planetslist, android.r.layout.simple_list_item_1, new string[] { "planet" }, new int[] { android.r.id.text1 }); lv.setadapter(simpleadpt); lv.setonitemclicklistener(new adapterview.onitemclicklistener() { public void onitemclick(adapterview<?> parentadapter, view view, int position, long id) { // know view textview can cast textview clickedview = (textview) view; toast.maketext( getactivity(), "item id [" + id + "] - position [" + position + "] - planet [" + clickedview.gettext() + "]", toast.length_short).show(); } }); registerforcontextmenu(lv); return view; } private void initlist() { // populate planets planetslist.add(createplanet("planet", "mercury")); planetslist.add(createplanet("planet", "venus")); planetslist.add(createplanet("planet", "mars")); planetslist.add(createplanet("planet", "jupiter")); planetslist.add(createplanet("planet", "saturn")); planetslist.add(createplanet("planet", "uranus")); planetslist.add(createplanet("planet", "neptune")); } private hashmap<string, string> createplanet(string key, string name) { hashmap<string, string> planet = new hashmap<string, string>(); planet.put(key, name); return planet; } // want create context menu when user long click on item @override public void oncreatecontextmenu(contextmenu menu, view v, contextmenuinfo menuinfo) { super.oncreatecontextmenu(menu, v, menuinfo); adaptercontextmenuinfo ainfo = (adaptercontextmenuinfo) menuinfo; // know each row in adapter map hashmap map = (hashmap) simpleadpt.getitem(ainfo.position); menu.setheadertitle("options " + map.get("planet")); menu.add(1, 1, 1, "details"); menu.add(1, 2, 2, "delete"); } @override public void onitemadded(object data) { // add item string string = string.valueof(data); toast.maketext(getcontext(), "data: " + string, toast.length_short).show(); planetslist.add(createplanet("planet", string)); } @override public void onstart() { super.onstart(); datamodel.getinstance().setonitemaddedhandler(this); } } this fragmentbase:
import android.support.v4.app.fragment; import android.support.v4.app.fragmentactivity; public class fragmentbase extends fragment { private fragmentactivity mactivity; // changed fragmentactivity because activity not working, , `navdrawer` fragmentactivity. public void setcontext(fragmentactivity activity) { mactivity = mactivity; } public fragmentactivity getcontext() { return mactivity; } } this datamodel:
import android.util.log; import com.xxx.xxx.quicknotefragment.onitemaddedhandler; public class datamodel { private static datamodel instance; private static onitemaddedhandler monitemaddhandler; public static datamodel getinstance() { if (null == instance) { instance = new datamodel(); } return instance; } public void setonitemaddedhandler(onitemaddedhandler handler) { monitemaddhandler = handler; } public void additem(object data) { if (null != monitemaddhandler) monitemaddhandler.onitemadded(data); else { log.i("is context null?", "yes!"); } } } thank you
i suggest use interface , mvc, make code more maintainable.
first need interface:
public interface onitemaddedhandler { public void onitemadded(object data); } then, need data model:
public class datamodel { private static datamodel instance; private static onitemaddedhandler monitemaddhandler; public static datamodel getinstance() { if (null == instance) { instance = new datamodel(); } return instance; } public void setonitemaddedhandler(onitemaddedhandler handler) { monitemaddhandler = handler; } public void additem(object data) { if (null != monitemaddhandler) monitemaddhandler.onitemadded(data); } } when click button, can add data datamodel:
object data = null; datamodel.getinstance().additem(data); then, fragmentb implements interface onitemaddedhandler add item
public class fragmentb implements onitemaddedhandler { @override public void onitemadded(object data) { // add item } } also, when fragmentb start, should register datamodel:
public class fragmentb implements onitemaddedhandler { @override public void onitemadded(object data) { // add item } @override protected void onstart() { super.onstart(); datamodel.getinstance().setonitemaddedhandler(this); } } you can add datamodel.getinstance().setonitemaddedhandler(this); oncreate method of fragmentb
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); datamodel.getinstance().setonitemaddedhandler(this); // other things } update
you can send string simply:
string data = "some string"; datamodel.getinstance().additem(data); then on fragementb
public class fragmentb implements onitemaddedhandler { @override public void onitemadded(object data) { // send method datamodel.getinstance().additem(data); string string = string.valueof(data); } } update
ok. have add datamodel.getinstance().setonitemaddedhandler(this) in oncreateview method, there no need add in onstart() method. can remove whole onstart method.
onstart called on fragment start, not need call in oncreateview. , on onitemadded call when call method datamodel.getinstance().additem(data), not need call in oncreateview neither.
so, can remove code below oncreateview method:
datamodel.getinstance().setonitemaddedhandler(this); // remove methods below // onitemadded(getview()); // onstart(); you have fragment there button, can add codes below in clickhandler function:
string data = "some string"; datamodel.getinstance().additem(data); update3
i think historyfragment has been detached after when quicknotefragment can add code historyfragment check:
@override public void ondetach() { super.ondetach(); log.i("test", string.format("ondetach! %s", getactivity() == null)); } update4
i think historyfragment , quicknotefragment should has parent class, named fragmentbase:
public class fragmentbase extends fragment { private activity mactivity; public void setcontext(activity activity) { mactivity = mactivity; } public activity getcontext() { return mactivity; } } historyfragment , quicknotefragment extends fragmentbase. when switch between them, can call setcontext set activity, like:
private void selectitem(int position) { fragmentmanager fragmentmanager = getsupportfragmentmanager(); if (position == 0) { fragment qnfragment = new quicknotefragment(); qnfragment.setcontext(this); // ... } else if (position == 1) { fragment pagerfragment = new remviewpager(); pagerfragment.setcontext(this); // ... } } now, can non-null activity in historyfragment calling getcontext, can change onitemadded method to:
@override public void onitemadded(object data) { // add item string string = string.valueof(data); toast.maketext(getcontext(), "data: " + string, toast.length_short).show(); planetslist.add(createplanet("planet", string)); } i hope work.
Comments
Post a Comment