On subclasses of View there is a getTag() method, which returns the android:tag attribute’s value from .xml.
I would like the same for a MenuItem… is it okay to just cast it to a View?
Because item elements also allow a tag attribute in .xml…
Update: My goal with this is setting a tag in .xml, i.e. "notranslate", and querying it at runtime (we localize by hand at runtime, don’t ask…)
MenuItem is an interface. Any class can implement this interface and so it will not always be safe to cast the MenuItem to a View. You can use the “instanceOf” operator to test to see if the object that implements the MenuItem interface is indeed a View or not.
I understand that you want to define a flag in the XML definition of the menu and then at run time interrogate that flag to make a programmatic decision.
The Menu Resource Documentation records what attributes can be set in the XML. You can consider using (abusing) one of those settings such as the “android:alphabeticShortcut” to encode the flag and use the MenuItem::getAlphabeticShortcut() method to get the value. This does not require casting – it just uses the existing fields in the MenuItem XML construct/class for your own purposes.
Perhaps a less hacky way to do this is to keep a simple table in a separate assets file that lists the menu item identifiers and the special behavior associated with that identifier such as to translate or not to translate.
Alternatively create a simple class that has a table with this configuration information hard coded using the logical “@[+][package:]id/resource_name” resource identifier as the keys to the table. While this doesn’t keep it all in one place (in the XML) it does it in a manner that is not encoding information in unused attributes, or relying on the ids not changing. The “table” could be implemented as a static method with an embedded switch statement allowing code such as “if (TranslationTable.shouldTranslate(menuItem.getItemId())) { do translation }”