android - Why is my DrawerLayout still open on activity resume, in spite of closing it? -
i have drawerlayout contains listview of items link other activities. onitemclick event of listview switch-case each menu element, runs code
... case targetactivity: listviewinstance.clearchoices(); drawerinstance.closedrawer(mainmenulayout); drawerinstance.requestlayout(); startactivity(targetintent); break; ... this works expected, if change device orientation , targetintent returns base activity cleartop flag, drawerlayout still open! in spite of explicit call closedrawer, , despite fact can see closing new activity starting. doing wrong? (i using xamarin.android, if relevant).
[edit 1: suspect closedrawer registers drawer closed when closing animation completed, , base activity paused before occurs. if call closedrawer in different thread , pause current thread moment before call startactivity, drawer works expected, although of course not suitable solution. have better idea how solve in clean fashion?].
[edit 2: 1 possible solution, linked here, create event listener drawer's ondrawerclosed event:
public class drawerlistener2 : drawerlayout.simpledrawerlistener { public override void ondrawerclosed(view view) { base.ondrawerclosed(view); var listparent = (relativelayout)view; var listviewinstance = listparent.findviewbyid<listview>(resource.id.mainmenu); int selectedindex = menulistview.checkeditemposition; switch (selectedindex) { case 0: // start activity break; case 2: // element 1 menu spacer // start activity b break; case 3: // start activity c break; } } } ... // in base activity's onresume: drawerinstance.setdrawerlistener(new drawerlistener2()); ... this has 2 problems make no-go: have recreate menu item order in switch-case since can't reach object contains information in ondrawerclosed handler, , can't start required activities event handler since these require intent information base activity].
solved semi-ugly hack:
in base activity, create property stores value extra:
private bool forcedrawermenucloseonactivityresume { { return intent.getbooleanextra("forcedrawermenucloseonactivityresumekey", false); } set { intent.putextra("forcedrawermenucloseonactivityresumekey", value); } } in base activity's onresume(), re-close drawer if property set:
if (forcedrawermenucloseonactivityresume) { drawerinstance.closedrawer(mainmenulayout); forcedrawermenucloseonactivityresume = false; } when closing drawer, before starting activity causes drawer remain open on activity resume:
case targetactivity: drawerinstance.closedrawer(mainmenulayout); listviewinstance.clearchoices(); forcedrawermenucloseonactivityresume = true; startactivity(targetintent);
Comments
Post a Comment