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

Popular posts from this blog

shopping cart - Page redirect not working PHP -

php - How to modify a menu to show sub-menus -

python - Installing PyDev in eclipse is failed -