How to access an Activites Menu programatically?

by Carl Whalley » Wed, 19 Aug 2009 03:31:12 GMT


Sponsored Links
 I'm writing unit tests in a class derived from
ActivityInstrumentationTestCase2. I know I can access anything defined
in the applications XML using findViewById(), but this application
defines its Menu programmatically. I'm trying to access that menu so I
can fire click() events to it in my tests the same way I'm doing with
Button Views etc.

To illustrate, this works fine and shows I can control/test various
Views:

public void testMyAppEdit() {
        MyAppActivity main = (MyAppActivity) getActivity();

        EditText val1Edit = (EditText) main.findViewById(R.id.EditText1);
        val1Edit.setText("3");

        Button addButton = (Button) main.findViewById(R.id.ButtonAdd);
        addButton.performClick();

        TextView resultText = (TextView) main.findViewById(R.id.Result);

        assertEquals("Result incorrect", resultText.getText(), "3");
}

But I need to do the same to fire Menu events:

public void testMyAppAboutBox() {
        MyAppActivity main = (MyAppActivity) getActivity();

        // Huh? this menu has no id, and no obvious way of accessing it...
        //Menu menu = (Menu) main.findViewById(id);
...
}

Thanks.

--
Android Academy  http://www.androidacademy.com 
--~--~---------~--~----~------------~-------~--~----~



How to access an Activites Menu programatically?

by Carl Whalley » Wed, 19 Aug 2009 18:11:04 GMT


 hanks - just establishing theres no framework way to get menus.
So I did as you suggested and there still some wierdness. I added a
getter for the menu but it always returns null:

public class MyAppActivityTest extends
ActivityInstrumentationTestCase2< MyAppActivity> {

@UiThreadTest
public void testMyAppAboutBox() {
MyAppActivity main = (MyAppActivity) getActivity();
Menu menu = main.getMenu();
}

Could it be the Activities onCreateOptionsMenu() hasn't been called?
Is there more I should be doing in my test to help establish the
Activities runtime context?

On a different thread (:-)), I tried this:

@UiThreadTest
public void testAbout() {
MainActivity main = (MainActivity) getActivity();
sendKeys(KeyEvent.KEYCODE_MENU);

Menu menu = main.getMenu();
menu.performIdentifierAction(R.id.about, 0);
}

Hoping the key event would cause the menu to be inflated, but that
just causes:

java.lang.RuntimeException: This method can not be called from the
main application thread
at android.app.Instrumentation.validateNotAppThread
(Instrumentation.java:1500)
at android.app.Instrumentation.sendKeySync(Instrumentation.java:933)
...

Thanks

On Aug 18, 8:59pm, Dianne Hackborn <hack...@android.com> wrote:
--~--~---------~--~----~------------~-------~--~----~


Sponsored Links