java - Inflate action mode menu based on the item that was clicked -
i have activity on tablet uses master/detail flow checkbook app (accounts on left, transactions on right).
when item hard pressed use contextual action bar allow user edit/delete items if necessary. this:
@override public void ontransactionlongclick(transaction t) { if(mactionmode == null){ // start cab using actionmode.callback defined mactionmode = startsupportactionmode(mactionmodecallback); // name set title action bar mactionmode.settitle(t.getdescription()); // account id pass tag. mactionmode.settag(t); } } @override public void onaccountlongselected(accountprimitives ap) { // don't fire if action mode active. if(mactionmode == null){ // start cab using actionmode.callback defined mactionmode = startsupportactionmode(mactionmodecallback); // name set title action bar mactionmode.settitle(ap.getname()); // account id pass tag. mactionmode.settag(ap); } } as can see, item selected , pass tag action mode know item start editing or delete database if necessary.
now have 2 pane layout, cannot setup action mode callback properly. want this:
private final actionmode.callback mactionmodecallback = new actionmode.callback() { // called when action mode created; startactionmode() called @override public boolean oncreateactionmode(actionmode mode, menu menu) { // inflate menu resource providing context menu items menuinflater inflater = mode.getmenuinflater(); // inflate based on tag type (account/transaction) if(mactionmode.gettag() instanceof accountprimitives){ inflater.inflate(r.menu.account_context_menu, menu); } else if(mactionmode.gettag() instanceof transaction){ inflater.inflate(r.menu.transaction_context_menu, menu); } return true; } // called each time action mode shown. called after oncreateactionmode, // may called multiple times if mode invalidated. @override public boolean onprepareactionmode(actionmode mode, menu menu) { return false; // return false if nothing done } // called when user selects contextual menu item @override public boolean onactionitemclicked(actionmode mode, menuitem item) { switch (item.getitemid()) { case r.id.action_delete_account: // account selected passed tag // action mode. showaccountdeletealertdialog((accountprimitives) mactionmode.gettag()); mode.finish(); // action picked, close cab return true; case r.id.action_delete_transaction: showtransactiondeletealertdialog((transaction) mactionmode.gettag()); mode.finish(); return true; default: return false; } } // called when user exits action mode @override public void ondestroyactionmode(actionmode mode) { mactionmode = null; } }; however, null pointer exception because action mode started before call mactionmode.settag(), can't determine type. in onxlongclick methods can't move settag() first line, because npe.
how can set condition inflate specific menu action mode?
edit
when long press item, following exception:
04-24 17:45:22.441 8117-8117/com.example.android.cashcaretaker e/androidruntime﹕ fatal exception: main process: com.example.android.cashcaretaker, pid: 8117 java.lang.nullpointerexception: attempt invoke virtual method 'java.lang.object android.support.v7.view.actionmode.gettag()' on null object reference @ com.example.android.cashcaretaker.accountsactivity$1.oncreateactionmode(accountsactivity.java:58) @ android.support.v7.app.actionbaractivitydelegatebase$actionmodecallbackwrapper.oncreateactionmode(actionbaractivitydelegatebase.java:1451) @ android.support.v7.internal.app.windowdecoractionbar$actionmodeimpl.dispatchoncreate(windowdecoractionbar.java:1015) @ android.support.v7.internal.app.windowdecoractionbar.startactionmode(windowdecoractionbar.java:510) @ android.support.v7.app.actionbaractivitydelegatebase.startsupportactionmode(actionbaractivitydelegatebase.java:570) @ android.support.v7.app.actionbaractivity.startsupportactionmode(actionbaractivity.java:225) @ com.example.android.cashcaretaker.accountsactivity.ontransactionlongclick(accountsactivity.java:177) @ com.example.android.cashcaretaker.transactionfragment$1.onitemlongclick(transactionfragment.java:72) @ android.widget.abslistview.performlongpress(abslistview.java:3121) @ android.widget.abslistview$checkforlongpress.run(abslistview.java:3070) @ android.os.handler.handlecallback(handler.java:739) @ android.os.handler.dispatchmessage(handler.java:95) @ android.os.looper.loop(looper.java:135) @ android.app.activitythread.main(activitythread.java:5254) @ java.lang.reflect.method.invoke(native method) @ java.lang.reflect.method.invoke(method.java:372) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:903) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:698) i same exception both accounts , transaction, difference method calls them.
the way solved problem creating second actionmode.callback object. first 1 made handle accounts, , second handle transactions.
they each 1 above, , able call them this:
// in account long click mactionmode = startsupportactionmode(maccountactionmodecallback); // in transaction long click mactionmode = startsupportactionmode(mtransactionactionmodecallback); then, in each of callbacks able inflate necessary menu , handle necessary action items.
Comments
Post a Comment