Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I programmatically check if the menu of my activity is showing at a particular moment?

Tags:

android

menu

An Android device configuration change (for example "slide the hard keyboard back in") will always call PhoneWindow.onConfigurationChanged(), which in turn, will call reopenMenu(). This will cause the menu of the currently running activity to be reopened, in case it is showing.

I have a lock on my menu implemented in my onPrepareOptionsMenu() override. The user must enter a code each time they want to see the menu. I don't want the user to be asked to enter the code again, while the menu is still up just because of a configuration change. Thus, I would like to know, is there any way I can check if the menu of current foreground activity is already showing? Knowing this, I could bypass asking for the access code if the menu is already up.

My custom workaround implementation is to use my own flag menuShowing, which I set in onPrepareOptionsMenu and reset in onOptionsItemSelected and in onKeyDown if the back button is clicked.

EDIT: It appears a screen orientation configuration change does not trigger this behavior. A hard keyboard slide however, does.

like image 866
Stefan Anca Avatar asked May 10 '12 22:05

Stefan Anca


People also ask

How do you know if activity is visible?

In your finish() method, you want to use isActivityVisible() to check if the activity is visible or not. There you can also check if the user has selected an option or not. Continue when both conditions are met.

How do you check if activity is finished or not?

Using activity. isFinishing() is the right one solution. it return true if activity is finished so before creating dialog check for the condition. if true then create and show dialog.

What is Flag_activity_new_task?

The flags you can use to modify the default behavior are: FLAG_ACTIVITY_NEW_TASK. Start the activity in a new task. If a task is already running for the activity you are now starting, that task is brought to the foreground with its last state restored and the activity receives the new intent in onNewIntent() .


1 Answers

Until someone comes up with a nicer 'one call' answer, here is the custom workaround implementation that I mention in the question, with help from Sam's tips, in case someone needs the same functionality:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (showingMenu) {
        // The menu button was clicked or the hard keyboard was
        // slid open/closed while the menu was already showing
        return true;
    }
    // Otherwise, either the menu was clicked or openOptionsMenu() was called
    if (codeEntered) {
        // Code was entered and then openOptionsMenu() was called
        showingMenu = true;
        // Menu will now be shown
        return true;
    } else {
        // The menu button was clicked, ask for code
        askForCode();
        // Don't show menu yet
        return false;
    }
}    

@Override
public void onOptionsMenuClosed(Menu menu) {
    showingMenu = false;
    codeEntered = false;
}

private void askForCode() {
    codeEntered = getUserInput();
    if (codeEntered)
        openOptionsMenu();
}

getUserInput() actually occurs with the help of an AlertDialog and an EditText with an attached TextWatcher but the implementation details exceed the scope of this question, unless someone is interested.

like image 76
Stefan Anca Avatar answered Sep 18 '22 15:09

Stefan Anca