On Feb 18, 2012, at 7:57 PM, tweaver60 wrote:
> if I can use a combination of custom attributes, with adding my own items 
> into the AndroidManifest.xml file, such as receiver.

You can, and in some instances, you must.

The rule of thumb is that if the type is written in C# AND it is an Activity, 
Service, BroadcastReceiver, or ContentProvider, then you should use the custom 
attributes (which coincidentally have the same name as the base type ;-). 
Otherwise you must use XML within AndroidManifest.xml.

For example, AdMob provides a Java Activity that you need to add to your 
AndroidActivity.xml. There is no way to use custom attributes for the AdMob 
activity, so you must instead add the <activity/> to 
Properties\AndroidManifest.xml:

        <activity android:name="com.google.ads.AdActivity"
                      
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

> I am very confused by the following statement in that article: "The merging 
> that mandroid.exe produces is trivial: it uses the custom attributes within 
> the code to generate XML elements, and inserts those elements into 
> AndroidManifest.xml. Elements nested within /manifest/application are not 
> merged, and Properties\AndroidManifest.xml always overrides data provided by 
> custom attributes."
> 
> Especially the nesting, since most of the custom attributes I would think go 
> inside the application tag.

That is correct, [Activity], [Service], etc. generate elements within the 
//application element.

What the text means is this: consider the following type:

        namespace Example {
                [Service]
                public class MyService : Service { /* ... */ }
        }

This will generate an Android Callable Wrapper named `example.MyService`, and 
would normally generate the appropriate XML:

        <!-- generated based on custom attributes -->
        <service android:name="example.MyService" />

HOWEVER, if your AndroidManifest.xml _already_ contains a declaration for that 
type:

        <!-- within Properties\AndroidManifest.xml -->
        <service android:name="example.MyService" android:enabled="false" />

then the Properties\AndroidManifest.xml version overrides whatever you 
specified in the custom attributes. So if you update your C# code:

        [Service(Icon="@drawable/foo")]
        public class MyService : Service { /* ... */ }

the resulting AndroidManifest.xml will NOT contain a //service/@android:icon 
attribute, because you already provided the 
//service[@android:name="example.MyService"] element.

As the documentation states, no merging is done: it's one or the other, and 
AndroidManifest.xml trumps custom attributes.

> Ultimately,  my goal is to create a widget, but the tutorial I found (using 
> Eclipse/Java) discusses creating an XML to define the AppWidget provider

Presumably it's something like this:

        http://developer.android.com/guide/topics/appwidgets/index.html

The XML it uses is a <receiver/> element, so you could just use the 
[BroadcastReceiver] custom attribute to generate the <receiver/> element. That 
example also has <intent-filter/> and <meta-data/>, which also have custom 
attributes defined:

        [BroadcastReceiver]
        [IntentFilter (new[]{"android.appwidget.action.APPWIDGET_UPDATE"})]
        [MetaData ("android.appwidget.provider", 
Resource="@xml/example_appwidget_info")]
        class MyAppWidgetProvider : Android.Appwidget.AppWidgetProvider {
                // ...
        }

However, there are no custom attributes for the <appwidget-provider/> element, 
so that would need to be manually provided (and it wouldn't be within 
AndroidManifest.xml either; "Define the AppWidgetProviderInfo object in an XML 
resource...").

> and I'm not sure where to place that XML file, since the folder structure is 
> quite different from the Mono for Android structure.

It's not that different. What Android calls "res" we call "Resources"; the 
contents are the same. Thus, for an XML resource, you'd want to create 
Resources\xml\example_appwidget_info.xml. Don't forget to set its Build action 
to AndroidResource; failure to do so will prevent the resource from being added 
to the Android package.

 - Jon

_______________________________________________
Monodroid mailing list
[email protected]

UNSUBSCRIBE INFORMATION:
http://lists.ximian.com/mailman/listinfo/monodroid

Reply via email to