<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://www.broculos.net">
<channel>
 <title>Broculos.net</title>
 <link>http://www.broculos.net</link>
 <description>Programming tutorials, always fresh and nutritive.</description>
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Broculosnet" /><feedburner:info uri="broculosnet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FBroculosnet" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FBroculosnet" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FBroculosnet" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Broculosnet" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FBroculosnet" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FBroculosnet" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FBroculosnet" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FBroculosnet" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><item>
 <title>IIS 6 website redirect</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/PEDKAAkubdg/iis-6-website-redirect</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4qlML7gbB1jdpEWAulQyfmcgJck/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4qlML7gbB1jdpEWAulQyfmcgJck/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4qlML7gbB1jdpEWAulQyfmcgJck/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4qlML7gbB1jdpEWAulQyfmcgJck/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;Sometimes you have a website with many domains (org, com, net, etc.) and you want all of them to redirect to the main domain. This is very easy to accomplish with IIS (IIS 6, no modules required). IIS has a &lt;a href="http://www.webmasterworld.com/forum23/3432.htm"&gt;built in rewrite module&lt;/a&gt; that will let you &lt;a href="http://www.windowshostingasp.net/windows_hosting_forums/showthread.php?t=35"&gt;redirect to a specific URL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You could also have several URLs mapped to the same website in IIS, but this is not what we want, because we need that the secondary URLs actually redirect to the main one (meaning that &lt;strong&gt;domain.org/something&lt;/strong&gt; would change to &lt;strong&gt;&lt;a href="http://www.domain.com/something"&gt;www.domain.com/something&lt;/a&gt;&lt;/strong&gt; automatically).&lt;/p&gt;
&lt;p&gt;You need to create a new website in IIS just for the redirects (meaning that all the secondary URLs can be mapped to this same website in IIS, so we can apply the redirect rule to all of them at the same time). You can use the same settings as the real website. The directory you choose doesn't matter, because it will be changed later.&lt;/p&gt;
&lt;p&gt;To setup the redirection in IIS:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Go to the properties of the website entry where you want to setup the redirection.&lt;/li&gt;
&lt;li&gt;Go to the &lt;strong&gt;Home Directory&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;A redirection to a URL&lt;/strong&gt;.
&lt;ul&gt;&lt;li&gt;Type the URL you want to redirect to (something like &lt;strong&gt;&lt;a href="http://www.example-new.com"&gt;http://www.example-new.com&lt;/a&gt;$S$Q&lt;/strong&gt; - notice the parameters and the lack of dashes).&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;The exact URL entered above&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;A permanent redirection for this resource&lt;/strong&gt; if you want a permanent redirect (301) or leave it unchecked for a temporary redirect (302).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The parameters after the main URL tell IIS to redirect to the specific subdirectory and to use the query parameters that were requested. You can check in more detail what each parameter does in the &lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/41c238b2-1188-488f-bf2d-464383b1bb08.mspx?mfr=true"&gt;Redirect reference for IIS 6&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=PEDKAAkubdg:9OOd9u5eHt8:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=PEDKAAkubdg:9OOd9u5eHt8:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=PEDKAAkubdg:9OOd9u5eHt8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=PEDKAAkubdg:9OOd9u5eHt8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=PEDKAAkubdg:9OOd9u5eHt8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=PEDKAAkubdg:9OOd9u5eHt8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=PEDKAAkubdg:9OOd9u5eHt8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=PEDKAAkubdg:9OOd9u5eHt8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=PEDKAAkubdg:9OOd9u5eHt8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=PEDKAAkubdg:9OOd9u5eHt8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=PEDKAAkubdg:9OOd9u5eHt8:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/PEDKAAkubdg" height="1" width="1"/&gt;</description>
 <pubDate>Sun, 15 Jan 2012 17:57:01 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">141 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/iis-6-website-redirect</feedburner:origLink></item>
<item>
 <title>Google Currents: Broculos.net Edition</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/E0uthjqj5ng/google-currents-broculosnet-edition</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ke_NbwWIObkeSEQU7Nx3QZN8YAk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ke_NbwWIObkeSEQU7Nx3QZN8YAk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ke_NbwWIObkeSEQU7Nx3QZN8YAk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ke_NbwWIObkeSEQU7Nx3QZN8YAk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;We just created a &lt;a href="http://www.google.com/producer/editions/CAowwZlD/broculosnet_programming_tutorials"&gt;Google Currents edition&lt;/a&gt; with the content of our blog and our Google+ activity.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.google.com/producer/currents"&gt;Google Currents&lt;/a&gt; is a news reader for Android and iOS devices. It has a clean layout and the content adapts to the device. Publishers can create publications by combining feeds, media and social streams. One of the nicest features of Google Currents is that articles are stored for offline reading after syncing, so you can take them anywhere.&lt;/p&gt;
&lt;p&gt;To subscribe to our Google Currents edition first install the Google Currents application and then follow &lt;a href="http://www.google.com/producer/editions/CAowwZlD/broculosnet_programming_tutorials"&gt;this link&lt;/a&gt; on your device.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=E0uthjqj5ng:I-2kOuDiIlA:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=E0uthjqj5ng:I-2kOuDiIlA:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=E0uthjqj5ng:I-2kOuDiIlA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=E0uthjqj5ng:I-2kOuDiIlA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=E0uthjqj5ng:I-2kOuDiIlA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=E0uthjqj5ng:I-2kOuDiIlA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=E0uthjqj5ng:I-2kOuDiIlA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=E0uthjqj5ng:I-2kOuDiIlA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=E0uthjqj5ng:I-2kOuDiIlA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=E0uthjqj5ng:I-2kOuDiIlA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=E0uthjqj5ng:I-2kOuDiIlA:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/E0uthjqj5ng" height="1" width="1"/&gt;</description>
 <pubDate>Sun, 18 Dec 2011 21:51:37 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">139 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/news/google-currents-broculosnet-edition</feedburner:origLink></item>
<item>
 <title>Android 101: Publish to the Android Market</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/qHlRl-51wr8/android-101-publish-android-market</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/e32T4SIiuwlDp1xifhlsQxdKCZ0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e32T4SIiuwlDp1xifhlsQxdKCZ0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/e32T4SIiuwlDp1xifhlsQxdKCZ0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e32T4SIiuwlDp1xifhlsQxdKCZ0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an Android Development Guide. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-how-create-stackview-widget"&gt;How to create a StackView widget&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Although we haven’t actually published our Honeybuzz application (for &lt;a href="http://googleblog.blogspot.com/2011/10/fall-sweep.html"&gt;obvious reasons&lt;/a&gt;), we still learned some things that might be useful for any Android developer.&lt;/p&gt;
&lt;h2&gt;Your app on the Android Market&lt;/h2&gt;
&lt;p&gt;Now that you have built a great app and you’re ready to publish it in the market, don’t disregard the information you put in your market page. Put as much thought in your market page as you’ve put into building the application. The user might decide not to download your app if:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;You description is poor, has typos and/or doesn’t describe clearly what the app does.&lt;/li&gt;
&lt;li&gt;You have few screenshots, the image’s quality is poor or you don’t show screenshots of the main functionality.&lt;/li&gt;
&lt;li&gt;The app’s logo, name or your developer’s name looks bogus, unprofessional or cheap.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;This information might make it or break it for your app. If the user finds you page messy or unprofessional, he will simply search for another app that does the same as yours. Don’t throw all your development work down the drain just because you didn’t want to put in the extra time to write a decent description or take good quality screenshots. Continue reading for some more tips on this.&lt;/p&gt;
&lt;h2&gt;The app logo: Love at first sight?&lt;/h2&gt;
&lt;p&gt;A user searches for “note taking app”, hundreds of results show up. Which app will the user choose to click on to take a second look? Which one(s) would you choose?&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/content/android101-13-1.png" /&gt;&lt;/p&gt;
&lt;p&gt;You’d probably check first the apps with the sleekest looking logo and the better sounding name. Among so many options the user needs to make a decision, so he’ll make generalizations and assumptions based on that ten seconds look at the search results.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(34, 34, 34); font-family: arial, sans-serif; line-height: normal; background-color: rgba(255, 255, 255, 0.917969); "&gt;&lt;br /&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Check out these resources and guidelines to create a great app icon.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/practices/ui_guidelines/icon_design_launcher.html"&gt;Launcher Icons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/support/androidmarket/developer/bin/answer.py?&amp;amp;&amp;amp;answer=1078870"&gt;Graphic Assets for your Application&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Write a great app description&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Study the market. Read the pages of your competitor apps. Be better than them. Don’t just do what they do, go a step further. If your competitors only have screenshots of their apps, add a video demo to yours.&lt;/li&gt;
&lt;li&gt;Description above the fold. If you have a big description part of it will be collapsed on the market. The user may or may not expand the whole description to read it. Be sure to write the enough information above the fold to convey your point, say why your app is great.&lt;/li&gt;
&lt;li&gt;List the all main features in your app.&lt;/li&gt;
&lt;li&gt;Don’t be afraid to brag. If your app won some award or was positively reviews by a very relevant publication, say it. This kind of information gives the user the security he needs to know this is the app he’s been looking for.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;More resources&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/publishing/publishing.html"&gt;Publishing on Android Market&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/events/io/2011/sessions/android-market-for-developers.html"&gt;Android Market for Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/guide/practices/screens_support.html"&gt;Supporting Multiple Screens&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qHlRl-51wr8:_5hoLDmo8qA:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=qHlRl-51wr8:_5hoLDmo8qA:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qHlRl-51wr8:_5hoLDmo8qA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qHlRl-51wr8:_5hoLDmo8qA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qHlRl-51wr8:_5hoLDmo8qA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=qHlRl-51wr8:_5hoLDmo8qA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qHlRl-51wr8:_5hoLDmo8qA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=qHlRl-51wr8:_5hoLDmo8qA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qHlRl-51wr8:_5hoLDmo8qA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=qHlRl-51wr8:_5hoLDmo8qA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qHlRl-51wr8:_5hoLDmo8qA:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/qHlRl-51wr8" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 14 Dec 2011 10:00:48 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">133 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-publish-android-market</feedburner:origLink></item>
<item>
 <title>Android 101: How to create a StackView widget</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/JvqmjcOYgu0/android-101-how-create-stackview-widget</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ucb70eLMKv1AhTpY5uaa0qHHhS4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ucb70eLMKv1AhTpY5uaa0qHHhS4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ucb70eLMKv1AhTpY5uaa0qHHhS4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ucb70eLMKv1AhTpY5uaa0qHHhS4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;Android Development Guide&lt;/a&gt;. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-how-monetize-your-android-application"&gt;How to monetize your Android application&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Widgets are a great tool for a user to customize his home screen. It is a great way to enhance an app's engagement. A widget can provide a lot of information at a glance and offer shortcuts for common actions.&lt;/p&gt;
&lt;p&gt;Honeycomb introduced widgets with collections. As the name implies, they are able to display several items. There are several types of widgets with collections:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;ListView&lt;/strong&gt;: a vertical scrolling list of items (e.g. Gmail widget).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GridView&lt;/strong&gt;: a scrolling list with two columns of items (e.g. bookmarks widget).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;StackView&lt;/strong&gt;: a stacked card view, where the front item can be flipped to give room for the item after it (e.g. Market widget).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdapterViewFlipper&lt;/strong&gt;: animates between views, only showing one at a time.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I will explain how we built the widget for the Honeybuzz application. It is a &lt;strong&gt;StackView &lt;/strong&gt;and displays Buzz-like cards with a user picture and a portion of the Buzz text.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_widget.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_widget-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Add the widget to the manifest&lt;/h2&gt;
&lt;p&gt;The widget needs to be declared in the application's manifest. Because we are using a &lt;strong&gt;StackView &lt;/strong&gt;widget, we specify both the widget provider and the widget service.&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;application&amp;gt;

	&amp;lt;!-- StackWidget Provider --&amp;gt;
	&amp;lt;receiver android:name="StackWidgetProvider"&amp;gt;
		&amp;lt;intent-filter&amp;gt;
			&amp;lt;action android:name="android.appwidget.action.APPWIDGET_UPDATE" /&amp;gt;
		&amp;lt;/intent-filter&amp;gt;
		&amp;lt;meta-data
			android:name="android.appwidget.provider"
			android:resource="@xml/stackwidgetinfo" /&amp;gt;
	&amp;lt;/receiver&amp;gt;
	
	&amp;lt;!-- StackWidget Service --&amp;gt;
	&amp;lt;service android:name="StackWidgetService"
		android:permission="android.permission.BIND_REMOTEVIEWS"
		android:exported="false" /&amp;gt;

&amp;lt;/application&amp;gt;&lt;/pre&gt;&lt;h2&gt;How to create the widget provider&lt;/h2&gt;
&lt;p&gt;For the widget provider, you need to specify the widget provider info and create the widget provider class implementation.&lt;/p&gt;
&lt;p&gt;The widget provider info is just an XML file that you create in the &lt;strong&gt;res\xml&lt;/strong&gt; folder of your application. Here is the file from the Honeybuzz application:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="220dp"
  android:minHeight="220dp"
  android:updatePeriodMillis="1800000"
  android:initialLayout="@layout/stackwidget"
  android:autoAdvanceViewId="@id/stackWidgetView"
  android:previewImage="@drawable/stackwidget_preview"&amp;gt;
&amp;lt;/appwidget-provider&amp;gt;&lt;/pre&gt;&lt;p&gt;Most of the attributes are self explanatory. The &lt;strong&gt;updatePeriodMillis&lt;/strong&gt; attribute defines how often it requests an update from the provider class. The minimum possible is 15 minutes, but you should update as little as possible in order to save battery life.&lt;/p&gt;
&lt;p&gt;To determine the widget size you can use the following formula (given in the Android Developers site):&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;(number of cells * 74) - 2&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;So if you want a 3 by 3 widget like in the Honeybuzz application you get for each side:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;(3 * 74) - 2 = 220&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;p&gt;A layout widget is comparable to a normal layout for an Activity, but it is much more restrictive. They are based on &lt;strong&gt;RemoteViews&lt;/strong&gt; and both the layout classes and the views that you can use are limited (especially before Honeycomb, where scrolling views were not available for widgets).&lt;/p&gt;
&lt;p&gt;A layout for a &lt;strong&gt;StackView &lt;/strong&gt;widget can be as simple as the following:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"&amp;gt;
    &amp;lt;StackView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/stackWidgetView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:loopViews="true" /&amp;gt;
    &amp;lt;TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/stackWidgetEmptyView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/no_activities"
        android:background="@drawable/stackwidget_background"
        android:gravity="center"
        android:textColor="#ffffff"
        android:textStyle="bold"
        android:textSize="16sp" /&amp;gt;
&amp;lt;/FrameLayout&amp;gt;&lt;/pre&gt;&lt;p&gt;Now for the implementation of the widget provider class:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
public class StackWidgetProvider extends AppWidgetProvider {
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
    }

    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
    }

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int i = 0; i &amp;lt; appWidgetIds.length; ++i) {
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.stackwidget);

            // set intent for widget service that will create the views
            Intent serviceIntent = new Intent(context, StackWidgetService.class);
            serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
            serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); // embed extras so they don't get ignored
            remoteViews.setRemoteAdapter(appWidgetIds[i], R.id.stackWidgetView, serviceIntent);
            remoteViews.setEmptyView(R.id.stackWidgetView, R.id.stackWidgetEmptyView);
            
            // set intent for item click (opens main activity)
            Intent viewIntent = new Intent(context, HoneybuzzListActivity.class);
            viewIntent.setAction(HoneybuzzListActivity.ACTION_VIEW);
            viewIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
            viewIntent.setData(Uri.parse(viewIntent.toUri(Intent.URI_INTENT_SCHEME)));
            
            PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0);
            remoteViews.setPendingIntentTemplate(R.id.stackWidgetView, viewPendingIntent);
            
            // update widget
            appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
        }
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
}&lt;/pre&gt;&lt;p&gt;In the &lt;strong&gt;onUpdate &lt;/strong&gt;method we iterate through all the widget instances and we add Intents for the service that will create each widget view and also for an item's click.&lt;/p&gt;
&lt;h2&gt;Create the widget service and the view for each item&lt;/h2&gt;
&lt;p&gt;In a &lt;strong&gt;StackView&lt;/strong&gt; widget you need a separate layout that will be used to display a single item in the collection. You should know how to create one by now, but here is the one used in the Honeybuzz widget as an example:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/stackWidgetItem"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:background="@drawable/stackwidget_border"
    android:padding="4dp"&amp;gt;
    &amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:background="@drawable/stackwidget_background"&amp;gt;
          &amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/stackWidgetItemUser"
            android:orientation="vertical"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:padding="10dp"&amp;gt;
             &amp;lt;ImageView android:id="@+id/stackWidgetItemPicture"
                 android:layout_height="100dip"
                 android:layout_width="100dip"&amp;gt;
            &amp;lt;/ImageView&amp;gt;
            &amp;lt;TextView android:id="@+id/stackWidgetItemUsername"
                android:textSize="10sp"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                 android:paddingTop="6dp"&amp;gt;
            &amp;lt;/TextView&amp;gt;
           &amp;lt;/LinearLayout&amp;gt;
         &amp;lt;TextView android:id="@+id/stackWidgetItemContent"
             android:layout_height="fill_parent"
             android:layout_width="fill_parent"
             android:maxLines="7"
            android:paddingTop="6dp"
            android:paddingBottom="6dp"
            android:paddingRight="6dp"
            android:paddingLeft="0dp"&amp;gt;
        &amp;lt;/TextView&amp;gt;
    &amp;lt;/LinearLayout&amp;gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&lt;p&gt;The widget service has to specify the views factory, which is responsible for creating a view for each item in the collection.&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
public class StackWidgetService extends RemoteViewsService {
    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
    }
}

class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
    private final ImageDownloader imageDownloader = new ImageDownloader();
    private List&amp;lt;Buzz&amp;gt; mBuzzes = new ArrayList&amp;lt;Buzz&amp;gt;();
    private Context mContext;
    private int mAppWidgetId;

    public StackRemoteViewsFactory(Context context, Intent intent) {
        mContext = context;
        mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    }

    public void onCreate() {
    }

    public void onDestroy() {
        mBuzzes.clear();
    }

    public int getCount() {
        return mBuzzes.size();
    }

    public RemoteViews getViewAt(int position) {
        RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.stackwidget_item);
        
        if (position &amp;lt;= getCount()) {
            Buzz buzz = mBuzzes.get(position);
            
            if (buzz.picture != null) {
                try {
                    Bitmap picture = imageDownloader.downloadBitmap(buzz.picture, 100, 100, 70);
                    rv.setImageViewBitmap(R.id.stackWidgetItemPicture, picture);
                }
                catch(Exception e) {
                    Logging.e("Error reading picture file", e);
                }
            }
            
            if (!buzz.username.isEmpty()) {
                rv.setTextViewText(R.id.stackWidgetItemUsername, buzz.username);
            }
            rv.setTextViewText(R.id.stackWidgetItemContent, Html.fromHtml(buzz.content));
            
            // store the buzz ID in the extras so the main activity can use it
            Bundle extras = new Bundle();
            extras.putString(HoneybuzzListActivity.EXTRA_ID, buzz.id);
            Intent fillInIntent = new Intent();
            fillInIntent.putExtras(extras);
            rv.setOnClickFillInIntent(R.id.stackWidgetItem, fillInIntent);
        }
        
        return rv;
    }

    public RemoteViews getLoadingView() {
        return null;
    }

    public int getViewTypeCount() {
        return 1;
    }

    public long getItemId(int position) {
        return position;
    }

    public boolean hasStableIds() {
        return true;
    }

    public void onDataSetChanged() {
        mBuzzes = Buzz.getBuzzes(HoneybuzzApplication.buzz, mContext);
    }
}&lt;/pre&gt;&lt;p&gt;The important tidbits:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;StackWidgetService&lt;/strong&gt;: override the &lt;strong&gt;onGetViewFactory &lt;/strong&gt;method so we can return our own views factory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;StackRemoteViewsFactory&lt;/strong&gt;: will handle the views for each item in the collection.
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;onDataSetChanged&lt;/strong&gt;: loads the necessary data that will be displayed in the widget.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;onDestroy&lt;/strong&gt;: make sure to destroy any objects that are no longer needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;getViewAt&lt;/strong&gt;: must return a view for the item at the specified position. We create a new view from the layout file specified previously, then we get the appropriate Buzz object which we use to fill the view with information. At the end we make sure the view has the on-click Intent, so that when it gets clicked, it will open the Honeybuzz application and load the correct Buzz object.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;How to create a preview image for your widget&lt;/h2&gt;
&lt;p&gt;A preview image will be shown when the user is selecting the widget to add from the gallery and will help a user understand how the widget looks like and what it does. If you don't provide a preview image for your widget, your application's icon will be used instead.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_widget_preview.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_widget_preview-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thankfully, the Android emulator and the Android SDK come with an application to generate a preview image from a widget. The application is called "Widget Preview" and you can either use it from the emulator or copy it to your own device and run it from there. You will find the code for the application in your SDK folder at &lt;strong&gt;android-sdk\samples\android-11\WidgetPreview&lt;/strong&gt;. You can open the project, build it and copy it to your device. The application is straightforward to use and very useful. After generating the image, you need to include it in the drawables of your project and specify it in the widget provider info resource (see the provider info above for an example).&lt;/p&gt;
&lt;h2&gt;More resources&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/topics/appwidgets/index.html"&gt;App Widgets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/guide/practices/ui_guidelines/widget_design.html"&gt;Widget Design Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/resources/samples/StackWidget/index.html"&gt;StackWidget&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-publish-android-market"&gt;Publish to the Android Market&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=JvqmjcOYgu0:OVWDHPCZdu8:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=JvqmjcOYgu0:OVWDHPCZdu8:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=JvqmjcOYgu0:OVWDHPCZdu8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=JvqmjcOYgu0:OVWDHPCZdu8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=JvqmjcOYgu0:OVWDHPCZdu8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=JvqmjcOYgu0:OVWDHPCZdu8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=JvqmjcOYgu0:OVWDHPCZdu8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=JvqmjcOYgu0:OVWDHPCZdu8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=JvqmjcOYgu0:OVWDHPCZdu8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=JvqmjcOYgu0:OVWDHPCZdu8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=JvqmjcOYgu0:OVWDHPCZdu8:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/JvqmjcOYgu0" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 12 Dec 2011 10:10:59 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">129 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-how-create-stackview-widget</feedburner:origLink></item>
<item>
 <title>Android 101: How to monetize your Android application</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/cIh21Nwf6yg/android-101-how-monetize-your-android-application</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_9F9wQLXydHR902qB5cnv9N4_Y4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_9F9wQLXydHR902qB5cnv9N4_Y4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_9F9wQLXydHR902qB5cnv9N4_Y4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_9F9wQLXydHR902qB5cnv9N4_Y4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an Android Development Guide. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-services-asynctasks-and-notifications"&gt;Services, AsyncTasks and Notifications&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There are several ways you can make money through the apps you develop. Let’s look at a few. See below for more extensive explanation on each of these:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Paid apps&lt;/li&gt;
&lt;li&gt;In-app purchase&lt;/li&gt;
&lt;li&gt;Ads&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Since we used ads in our application, you can find at the end of the article a step-by-step section on how to set up ads using Google’s AdMob.&lt;/p&gt;
&lt;h3&gt;Paid Apps&lt;/h3&gt;
&lt;p&gt;Paid apps are downloaded less often than free aps, but for each person that downloads your app you’ll have a guarantee of profit.&lt;/p&gt;
&lt;p&gt;You have different options for selling paid apps.&lt;/p&gt;
&lt;h4&gt;Paid version only&lt;/h4&gt;
&lt;p&gt;You can have only a paid version of you app. Think well before going through this path. The user needs to trust that the promises you make about the app will come true after he downloads it. The user is giving you money for something he most probably hasn’t tried before. You need to gain his trust. Prepare a good marketing campaign. Listen to what other users are telling you through reviews. Make some demo videos of your app, this way the user has a better knowledge of the feel of the app. Have a good app portfolio, your history speaks for you. 5 stars apps in the past is an assurance of good quality in the present.&lt;/p&gt;
&lt;h4&gt;Lite version&lt;/h4&gt;
&lt;p&gt;You can have a free lite version of your app and a paid version with extra functionality. This is a great way of teasing the users about the value of the app. The user can play around, test the main functionality, the feel of the app, and then decide if they want the full package. Be sure to give the user enough, even in the lite version, so that he can use it properly and test it thoroughly, but leave out the special stuff that the user surely won’t be able to live without.&lt;/p&gt;
&lt;h4&gt;Ad free&lt;/h4&gt;
&lt;p&gt;You can have a free ad-supported version of your app and in it you promote your ad-free paid app.&lt;/p&gt;
&lt;h4&gt;Make the decision&lt;/h4&gt;
&lt;p&gt;Study the option of selling your app. People will only give money for something that they can’t find for free and will give them added value. Study the market, what kind of other apps exist that do something similar to yours? How are these other apps being monetized?&lt;/p&gt;
&lt;h3&gt;In-app purchase&lt;/h3&gt;
&lt;p&gt;With in-app purchases you monetize your app selling content or extra functionality through the app itself. In a game you can have extra levels available through extra payment, for example.&lt;/p&gt;
&lt;h4&gt;Freemium&lt;/h4&gt;
&lt;p&gt;A freemium app is an app the user is free to download but then requires in-app purchases to expand the app usage. Image you have a bookstore app. You give the app free of charge and sell books to the user through the app.&lt;/p&gt;
&lt;h3&gt;Ads&lt;/h3&gt;
&lt;p&gt;Ads are an important way to get revenue from your apps. Ads give you the advantages of having a free app (that is more easily downloaded than a paid one) and still be able to monetize it. Ads are an old way of monetizing a product. TV, magazines, websites, already do it.&lt;/p&gt;
&lt;p&gt;Inside your app you can control where your ads are shown.&lt;/p&gt;
&lt;h4&gt;Learn the basics&lt;/h4&gt;
&lt;p&gt;You need to know &lt;a href="http://www.google.com/events/io/2011/sessions/dont-just-build-a-mobile-app-build-a-business.html"&gt;how ads work&lt;/a&gt;, if you want to optimize your income. Cost per Click, Request vs. Impressions, etc, are all concepts you need to learn to understand how ads generate money.&lt;/p&gt;
&lt;h4&gt;Track your results&lt;/h4&gt;
&lt;p&gt;You can also track the app usage as to optimize the ads. You can easily do this with Google Analytics.&lt;/p&gt;
&lt;h4&gt;Cross Promotion&lt;/h4&gt;
&lt;p&gt;Cross promote your apps, show in one of your apps ads for other apps you’ve created. You might have a small free app where you promote other paid apps you’ve created.&lt;/p&gt;
&lt;h4&gt;Sponsorship&lt;/h4&gt;
&lt;p&gt;You can also try to find a sponsor for your app. For example, if you have a fitness related app, you can find a company that sells energy drinks and negotiate a sponsorship. Of course this isn’t the easiest thing to achieve, but it might be something that fits the profile of your app.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(34, 34, 34); font-family: arial, sans-serif; line-height: normal; background-color: rgba(255, 255, 255, 0.917969); "&gt;&lt;br /&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Installing ads in your app with AdMob&lt;/h2&gt;
&lt;p&gt;It’s very easy to install ads in your application using Google’s &lt;a href="http://www.admob.com/"&gt;AdMob&lt;/a&gt;. Google provides a very clear and succinct set of instructions on &lt;a href="http://code.google.com/mobile/ads/docs/android/fundamentals.html"&gt;how to configure AdMob&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;1. Create an AdMob Account or use your existing Google account.&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/android101-11-1.png"&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/resize/content/android101-11-1-600x308.png" style="width: 600px; height: 308px; " width="600" height="308" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. Add a new app in your AdMob account.&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/android101-11-2.png"&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/resize/content/android101-11-2-600x325.png" style="width: 600px; height: 325px; " width="600" height="325" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It will show up under Sites &amp;amp; Apps.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/content/android101-11-3.png" style="width: 375px; height: 70px; " width="375" height="70" /&gt;&lt;/p&gt;
&lt;h4&gt;3. Go to Manage Settings.&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/android101-11-4.png"&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/resize/content/android101-11-4-600x200.png" style="width: 600px; height: 200px; " width="600" height="200" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here you’ll find the Publisher ID you’ll use later on. But now click on “Get Publisher Code”. Here we can download the libraries necessary to add to your app project.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/android101-11-5.png"&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/resize/content/android101-11-5-600x303.png" style="width: 600px; height: 303px; " width="600" height="303" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;4. Configure your code.&lt;/h4&gt;
&lt;p&gt;Use &lt;a href="http://code.google.com/mobile/ads/docs/android/fundamentals.html"&gt;Google’s instructions&lt;/a&gt; to add the code you’ve downloaded to your code project.&lt;/p&gt;
&lt;p&gt;You’ll also need the Publisher ID I’ve mentioned in the previous step.&lt;/p&gt;
&lt;h4&gt;5. Done.&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/android101-11-6.png"&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/resize/content/android101-11-6-600x355.png" style="width: 600px; height: 355px; " width="600" height="355" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;More resources&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.guidetotheappgalaxy.com/"&gt;The Guide to The App Galaxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/events/io/2011/sessions/dont-just-build-a-mobile-app-build-a-business.html"&gt;Don’t just build a mobile app. Build a business.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.androidguys.com/2009/09/14/40bizmodels/"&gt;40 Android Business Models, Part One&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-how-create-stackview-widget"&gt;How to create a StackView widget&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=cIh21Nwf6yg:nqkY5rN9n9o:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=cIh21Nwf6yg:nqkY5rN9n9o:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=cIh21Nwf6yg:nqkY5rN9n9o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=cIh21Nwf6yg:nqkY5rN9n9o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=cIh21Nwf6yg:nqkY5rN9n9o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=cIh21Nwf6yg:nqkY5rN9n9o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=cIh21Nwf6yg:nqkY5rN9n9o:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=cIh21Nwf6yg:nqkY5rN9n9o:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=cIh21Nwf6yg:nqkY5rN9n9o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=cIh21Nwf6yg:nqkY5rN9n9o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=cIh21Nwf6yg:nqkY5rN9n9o:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/cIh21Nwf6yg" height="1" width="1"/&gt;</description>
 <pubDate>Fri, 09 Dec 2011 09:35:50 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">131 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-how-monetize-your-android-application</feedburner:origLink></item>
<item>
 <title>Android 101: Services, AsyncTasks and Notifications</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/8xHgeutZOmA/android-101-services-asynctasks-and-notifications</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dOy81dQK05bAJIofGk2lpfQwTAM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dOy81dQK05bAJIofGk2lpfQwTAM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dOy81dQK05bAJIofGk2lpfQwTAM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dOy81dQK05bAJIofGk2lpfQwTAM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an Android Development Guide. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-use-fragments-handle-different-screen-orientations"&gt;Use Fragments to handle different screen orientations&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;AsyncTasks&lt;/h2&gt;
&lt;p&gt;The &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html"&gt;AsyncTask&lt;/a&gt; is kind of like a thread, only easier to use as you don’t need to manipulate threads or handlers. It allows you to perform operations in the background without freezing the main UI thread, but you can still manipulate the UI from it.&lt;/p&gt;
&lt;p&gt;You need to create a subclass of AsyncTask in order to use it. So you’ll need to override its methods, being the most relevant the doInBackground(Params...) and as its name indicates it will execute the work that needs to be done in the background.&lt;/p&gt;
&lt;p&gt;In our application we needed to load the Buzz stream, so the best way to do this would be with an AsyncTask. This will free up the main thread of the application, meaning the user won’t see any freezing of the UI, or worse, a warning to shut down the app because its taking too long to respond. See more details on &lt;a href="http://developer.android.com/guide/practices/design/responsiveness.html"&gt;how to design your app for responsiveness&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here’s an example from our app of the usage of AsyncTask:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
class LoadBuzzes extends AsyncTask&amp;lt;Void, Void, ArrayList&amp;lt; Buzz&amp;gt;&amp;gt; {
	@Override
	protected void onPreExecute() {
		getHoneybuzzActivity().showProgress(); // show loading screen
	}

	@Override
	protected ArrayList&amp;lt;Buzz&amp;gt; doInBackground(Void... params) {
		try {
			// we’re caching the data so we’ll check if we need to update it from the server or just load from cache
			boolean refresh = Buzz.getUpdateChachedBuzzes(getActivity());
			Buzz.setUpdateChachedBuzzes(getActivity(), false);
			return Buzz.getBuzzes(getBuzz(), getActivity(), refresh);
		}
		catch (Exception e) {
			handleException(e);
			return null;
		}
	}

	@Override
	protected void onPostExecute(ArrayList&amp;lt; Buzz&amp;gt; feed) {
		getHoneybuzzActivity().hideProgress(); // hide loading screen
		if (feed != null) {
			try {
				// load buzzes list onto the UI
			}
			catch(Exception e) {
				Logging.e("Error loading buzzes", e);
			}
		}
	}
}&lt;/pre&gt;&lt;p&gt;And this is how you’d launch this task:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
new LoadBuzzes().execute();&lt;/pre&gt;&lt;h2&gt;Services&lt;/h2&gt;
&lt;p&gt;From the &lt;a href="http://developer.android.com/reference/android/app/Service.html"&gt;Android documentation&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.&lt;/p&gt;
&lt;p&gt;To fetch the user stream from Google Buzz we used a Service that runs in the background and checks for updates. When updates are found, the service creates a new user notification. Here are the most important code bits from our sync service class.&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
private Timer mTimer = new Timer();
private NotificationManager mNM;

@Override
public void onCreate() {
	mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

	// the time interval between checks is saved in the app’s preferences
	SharedPreferences prefs = HoneybuzzApplication.getSharedPreferences();
	int intervalMinutes = Integer.parseInt(prefs.getString(HoneybuzzApplication.PREFERENCE_INTERVAL, String.valueOf(30)));
	int intervalMiliseconds = intervalMinutes * 60 * 1000;
	mTimer.schedule(mUpdateTask, intervalMiliseconds, intervalMiliseconds);
}

private TimerTask mUpdateTask = new TimerTask() {
	@Override
	public void run() {
		try {
			String lastUpdated = com.quasibit.honeybuzz.Buzz.getLastUpdated(getApplicationContext());
			String serverUpdate = com.quasibit.honeybuzz.Buzz.getServerUpdated(HoneybuzzApplication.buzz, getApplicationContext());

			// check if the last update to the server is the same as the last update available in cache
			if (!lastUpdated.equals(serverUpdate)) {
				Buzz.getBuzzes(HoneybuzzApplication.buzz, getApplicationContext(), true);

				// after the updates are loaded the user gets a notification
				showNotification();
			}
		}
		catch(Exception e) {
			Logging.e(e);
		}
	}
};&lt;/pre&gt;&lt;p&gt;Here’s a nice article with the &lt;a href="http://techtej.blogspot.com/2011/03/android-thread-constructspart-4.html"&gt;comparison between AsyncTask, Service, Thread and IntentService&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Notifications&lt;/h2&gt;
&lt;p&gt;A &lt;a href="http://developer.android.com/guide/topics/ui/notifiers/notifications.html"&gt;Notification&lt;/a&gt; is a message that will show up in the system’s status bar warning the user of something he should know about. Its implementation is very simple.&lt;/p&gt;
&lt;p&gt;In the case of our app we’re notifying the user whenever we find updates in the user’s Buzz stream. Here’s how we launch our notification:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
private NotificationManager mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

private void showNotification() {
	String msg = getApplicationContext().getString(R.string.notif_buzzupdates);
	Notification notification = new Notification(R.drawable.ic_launcher_honeybuzz, msg, System.currentTimeMillis());
	PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, HoneybuzzListActivity.class), 0);
	notification.setLatestEventInfo(this, getApplicationContext().getString(R.string.app_name), msg, contentIntent);
	mNM.notify(NOTIFICATION, notification);
}&lt;/pre&gt;&lt;p&gt;Optionally you can add a ticker-text message, an alert sound, vibration and/or flashing LED to your notification.&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://www.broculos.net/en/article/android-101-how-monetize-your-android-application"&gt;Next: How to monetize your Android application&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8xHgeutZOmA:7SaJol3xwxw:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=8xHgeutZOmA:7SaJol3xwxw:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8xHgeutZOmA:7SaJol3xwxw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8xHgeutZOmA:7SaJol3xwxw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8xHgeutZOmA:7SaJol3xwxw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=8xHgeutZOmA:7SaJol3xwxw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8xHgeutZOmA:7SaJol3xwxw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=8xHgeutZOmA:7SaJol3xwxw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8xHgeutZOmA:7SaJol3xwxw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=8xHgeutZOmA:7SaJol3xwxw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8xHgeutZOmA:7SaJol3xwxw:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/8xHgeutZOmA" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 07 Dec 2011 11:00:40 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">137 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-services-asynctasks-and-notifications</feedburner:origLink></item>
<item>
 <title>Android 101: Use Fragments to handle different screen orientations</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/5daXlKGbbfQ/android-101-use-fragments-handle-different-screen-orientations</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VzAoYpXQ7hjp4SkIwFurg6fmyAE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VzAoYpXQ7hjp4SkIwFurg6fmyAE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VzAoYpXQ7hjp4SkIwFurg6fmyAE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VzAoYpXQ7hjp4SkIwFurg6fmyAE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;Android Development Guide&lt;/a&gt;. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-themes"&gt;Styles and Themes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Honeycomb introduced the concept of Fragments. Fragments are the answer for handling different screen sizes, from phones to tablets, TVs and other gadgets. A Fragment represents a portion of the user interface. An Activity can have several Fragments and the same Fragment can be used in several Activities.&lt;/p&gt;
&lt;p&gt;Let us consider the most common example that demonstrates its usefulness. A left pane with a listing of items and a right pane with details of the currently selected item. Such is the layout of the Honeybuzz application. A layout like this can be built with two Fragments: one for the listing of items and the other for the details of an item. Depending on the device orientation, one might display both Fragments side by side or, if in portrait mode, only one of the Fragments would be displayed (first a listing would be shown and, when an item is selected, the details replace the listing).&lt;/p&gt;
&lt;h2&gt;Basic list and details layout with Fragments&lt;/h2&gt;
&lt;p&gt;Let us see how to build a layout such as the one in the Honeybuzz application. Here are the different parts involved:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;ListActivity&lt;/strong&gt;: has a different layout depending on screen orientation:
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;layout&lt;/strong&gt;: layout in landscape mode. Contains both &lt;strong&gt;ListFragment &lt;/strong&gt;and &lt;strong&gt;DetailsFragment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;layout-port&lt;/strong&gt;: layout in portrait mode. Only contains &lt;strong&gt;ListFragment&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DetailsActivity&lt;/strong&gt;: only used in portrait mode. Contains the &lt;strong&gt;DetailsFragment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ListFragment&lt;/strong&gt;: when an item is clicked, depending on the screen orientation, will either update the &lt;strong&gt;DetailsFragment &lt;/strong&gt;or open the &lt;strong&gt;DetailsActivity&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_landscape.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_landscape-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_portrait_listing.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_portrait_listing-78x125.png" style="width: 78px; height: 125px; " width="78" height="125" /&gt;&lt;/a&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_portrait_details.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_portrait_details-78x125.png" style="width: 78px; height: 125px; " width="78" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We basically have two different strategies and we will use them depending on the screen orientation.&lt;/p&gt;
&lt;h2&gt;Create the ListActivity and the ListFragment&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;ListActivity&lt;/strong&gt; is pretty straightforward. It is a normal Activity, but with a different layout for each screen orientation. As I explained previously, the layout in landscape mode contains both the &lt;strong&gt;ListFragment &lt;/strong&gt;and &lt;strong&gt;DetailsFragment&lt;/strong&gt; and the layout in portrait mode only contains the &lt;strong&gt;ListFragment&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;p&gt;Android is pretty smart in picking up the right resource file for a layout. If the device is in landscape mode, Android will first look into the &lt;strong&gt;layout-land&lt;/strong&gt; folder for a resource file. If it is not available, it will try to load it from the &lt;strong&gt;layout&lt;/strong&gt; folder. Likewise for portrait mode, but using the &lt;strong&gt;layout-port&lt;/strong&gt; folder instead. You basically create two different layout files with the same name and place one in each folder and Android will load it appropriately according to the screen orientation.&lt;/p&gt;
&lt;p&gt;Here is how the layout file looks like in landscape:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"&amp;gt;
    &amp;lt;fragment class="com.quasibit.honeybuzz.HoneybuzzListFragment"
            android:id="@+id/listFragment"
            android:layout_weight="1"
            android:layout_width="@dimen/list_item_size"
            android:layout_height="fill_parent" /&amp;gt;
    &amp;lt;fragment class="com.quasibit.honeybuzz.HoneybuzzDetailsFragment"
            android:id="@+id/details"
            android:layout_weight="2"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:background="?android:attr/detailsElementBackground" /&amp;gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&lt;p&gt;And in portrait mode:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"&amp;gt;
    &amp;lt;fragment class="com.quasibit.honeybuzz.HoneybuzzListFragment"
            android:id="@+id/listFragment"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent" /&amp;gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&lt;p&gt;Moving on to the &lt;strong&gt;ListFragment&lt;/strong&gt;, this will be the Fragment that displays a list of items. It can use a basic layout file. My layout only has a &lt;strong&gt;LinearLayout&lt;/strong&gt;, a &lt;strong&gt;ListView &lt;/strong&gt;and &lt;strong&gt;TextView&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listLayout"
      android:orientation="vertical" 
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"&amp;gt;
    &amp;lt;ListView
        android:id="@+id/listBuzzes" 
        android:drawSelectorOnTop="false" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" /&amp;gt;
    &amp;lt;TextView android:id="@android:id/empty"
               android:layout_height="fill_parent"
               android:text="@string/no_activities"
               android:layout_width="wrap_content"
               android:layout_gravity="left"
               android:layout_marginLeft="10dp"
               android:layout_marginTop="10dp" /&amp;gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&lt;p&gt;The important part is the Fragment class. Here is an excerpt with the most important bits:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
public class HoneybuzzListFragment extends HoneybuzzFragment implements OnItemClickListener {
    protected String mCurrentId;
    protected ListView mListView;
    protected ArrayList&amp;lt;com.quasibit.honeybuzz.Buzz&amp;gt; mBuzzes;
    protected Boolean mDualPane;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.list_fragment, container, false);
        
        return view;
    }
        
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        // set list view properties
        this.mListView = (ListView) getActivity().findViewById(R.id.listBuzzes);
        
        if (this.mListView != null) {
            this.mListView.setOnItemClickListener(this);
            this.mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        }

        // check if we are in dual pane mode
        HoneybuzzDetailsFragment details = (HoneybuzzDetailsFragment) getFragmentManager().findFragmentById(R.id.details);
        mDualPane = !(details == null || !details.isInLayout());
        
        // get current id from saved state or extras
        if (savedInstanceState != null) {
            // Restore last state for checked position.
            mCurrentId = savedInstanceState.getString(HoneybuzzListActivity.EXTRA_ID);
        }
        
        if (this.getActivity().getIntent() != null) {
            String id = this.getActivity().getIntent().getStringExtra(HoneybuzzListActivity.EXTRA_ID);
            
            if (id != null &amp;amp;&amp;amp; !id.isEmpty()) {
                mCurrentId = id;
            }
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(HoneybuzzListActivity.EXTRA_ID, mCurrentId);
    }

    @Override
    public void onItemClick(AdapterView&amp;lt;?&amp;gt; l, View v, int position, long id) {
        if (position &amp;lt; mBuzzes.size()) {
            // get matching buzz id from position
            String buzzId = mBuzzes.get(position).id;
            showDetails(buzzId);
        }
    }

    public void showDetails(String id) {
        if (id != null &amp;amp;&amp;amp; !id.isEmpty() &amp;amp;&amp;amp; mBuzzes != null &amp;amp;&amp;amp; !mBuzzes.isEmpty()) {
 // find buzz object
            com.quasibit.honeybuzz.Buzz buzz = getBuzz(id);
            
            if (buzz != null) {
                mCurrentId = id;
                
                // highlight selected item
                int index = mBuzzes.indexOf(buzz);
                
                if (index &amp;gt;= 0) {
                    mListView.setItemChecked(index, true);
                }
        
                // load item
                if (mDualPane) {
                    HoneybuzzDetailsFragment details = (HoneybuzzDetailsFragment) getFragmentManager().findFragmentById(R.id.details);
                    details.load(buzz);
                } else {
                    // launch new activity because we're in single mode pane
                    Intent showContent = new Intent(getActivity(), HoneybuzzDetailsActivity.class);
                    showContent.putExtra(HoneybuzzDetailsActivity.EXTRA_BUZZ, buzz);
                    startActivity(showContent);
                }
            }
        }
    }
}&lt;/pre&gt;&lt;p&gt;Notice the following:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The class inherits from &lt;strong&gt;HoneybuzzFragment&lt;/strong&gt;, which is just a Fragment with some Google Analytics tracking code and a few other helper methods.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;onCreateView&lt;/strong&gt;: used to inflate the proper layout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;onActivityCreated&lt;/strong&gt;: determine if we are in dual pane mode and register the findings in boolean &lt;strong&gt;mDualPane&lt;/strong&gt;. We also try to read the current ID both from the saved instance state (when the Activity is being recovered) and the extras data (when another part of the application requests to open a particular ID).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;onSaveInstanceState&lt;/strong&gt;: the current ID gets saved before the Activity goes to a background state. This ID gets recovered when the Activity is recreated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;showDetails&lt;/strong&gt;: loads the Buzz object with the given ID. The important thing to notice here is how the details are shown. If we are in dual pane mode, we retrieve the &lt;strong&gt;HoneybuzzDetailsFragment&lt;/strong&gt; and we pass the Buzz object. Otherwise, we launch the &lt;strong&gt;HoneybuzzDetailsActivity&lt;/strong&gt; and pass the Buzz object.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Building the DetailsFragment and DetailsActivity&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;DetailsActivity &lt;/strong&gt;will only be used in portrait mode. In portrait mode we need both a &lt;strong&gt;ListActivity&lt;/strong&gt; and a &lt;strong&gt;DetailsActivity&lt;/strong&gt;, because we have two different screens and we will only show one at a time.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;DetailsActivity&lt;/strong&gt; is pretty straightforward, we just reuse the &lt;strong&gt;DetailsFragment &lt;/strong&gt;(which is used both in the &lt;strong&gt;ListActivity &lt;/strong&gt;as well as in the &lt;strong&gt;DetailsActivity&lt;/strong&gt;):&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
public class HoneybuzzDetailsActivity extends HoneybuzzActivity {
    public static final String EXTRA_BUZZ = "com.quasibit.honeybuzz.HoneybuzzListActivity.EXTRA_BUZZ";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            // If the screen is now in landscape mode, we can show the
            // dialog in-line with the list so we don't need this activity.
            finish();
            return;
        }

        if (savedInstanceState == null) {
            // During initial setup, plug in the details fragment.
            HoneybuzzDetailsFragment details = new HoneybuzzDetailsFragment();
            details.setArguments(getIntent().getExtras());
            getFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
        }
    }
}&lt;/pre&gt;&lt;p&gt;The &lt;strong&gt;DetailsFragment &lt;/strong&gt;contains a &lt;strong&gt;load &lt;/strong&gt;method which fills the layout with the data of the Buzz object.&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
public class HoneybuzzDetailsFragment extends HoneybuzzFragment implements OnClickListener {
    protected com.quasibit.honeybuzz.Buzz mBuzz;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.details, container, false);
        
        return view;
    }
        
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        if (savedInstanceState != null) {
            // Restore last state for checked position.
            mBuzz = (Buzz) savedInstanceState.getSerializable(HoneybuzzDetailsActivity.EXTRA_BUZZ);
        }
        
        if (this.getActivity().getIntent() != null) {
            com.quasibit.honeybuzz.Buzz buzz = (Buzz) this.getActivity().getIntent().getSerializableExtra(HoneybuzzDetailsActivity.EXTRA_BUZZ);
            
            if (buzz != null) {
                mBuzz = buzz;
            }
        }
        
        if (mBuzz != null) {
            load(mBuzz);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putSerializable(HoneybuzzDetailsActivity.EXTRA_BUZZ, mBuzz);
    }
    
    public void load(com.quasibit.honeybuzz.Buzz buzz) {
        mBuzz = buzz;
        
        if (buzz != null) {
            // load views with Buzz object data
        }
    }
}&lt;/pre&gt;&lt;p&gt;In &lt;strong&gt;onActivityCreated &lt;/strong&gt;we try to find a Buzz object to display, either one saved before the Activity went to the background, or one passed in the extras (called from another part of the application).&lt;/p&gt;
&lt;h2&gt;More resources&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/topics/fundamentals/fragments.html"&gt;Fragments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2011/02/android-30-fragments-api.html"&gt;The Android 3.0 Fragments API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-services-asynctasks-and-notifications"&gt;Services, AsyncTasks and Notifications&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=5daXlKGbbfQ:QNI6JdWO5CY:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=5daXlKGbbfQ:QNI6JdWO5CY:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=5daXlKGbbfQ:QNI6JdWO5CY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=5daXlKGbbfQ:QNI6JdWO5CY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=5daXlKGbbfQ:QNI6JdWO5CY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=5daXlKGbbfQ:QNI6JdWO5CY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=5daXlKGbbfQ:QNI6JdWO5CY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=5daXlKGbbfQ:QNI6JdWO5CY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=5daXlKGbbfQ:QNI6JdWO5CY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=5daXlKGbbfQ:QNI6JdWO5CY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=5daXlKGbbfQ:QNI6JdWO5CY:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/5daXlKGbbfQ" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 05 Dec 2011 08:42:09 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">127 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-use-fragments-handle-different-screen-orientations</feedburner:origLink></item>
<item>
 <title>Android 101: Styles and Themes</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/OHEFohNtIMo/android-101-styles-and-themes</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/s7dwL14WOOFb8KhyHrmxgHvUHrk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s7dwL14WOOFb8KhyHrmxgHvUHrk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/s7dwL14WOOFb8KhyHrmxgHvUHrk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s7dwL14WOOFb8KhyHrmxgHvUHrk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;Android Development Guide&lt;/a&gt;. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-how-create-options-menu-action-bar"&gt;How to create an options menu for the Action Bar&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;What are styles and themes in Android? From the Android’s Developer Guide we know that:&lt;/p&gt;
&lt;p&gt;“A style is a collection of properties that specify the look and format for a View or window. A style can specify properties such as height, padding, font color, font size, background color, and much more. A style is defined in an XML resource that is separate from the XML that specifies the layout. ”&lt;/p&gt;
&lt;p&gt;“A theme is a style applied to an entire Activity or application, rather than an individual View. When a style is applied as a theme, every View in the Activity or application will apply each style property that it supports. ”&lt;/p&gt;
&lt;p&gt;So to summarize, a style is a set of proprieties that define the way a View or window looks. A theme is a specific kind of style that is scoped at Activity or application level.&lt;/p&gt;
&lt;h2&gt;Declare and apply a style&lt;/h2&gt;
&lt;p&gt;Let’s see how to declare a style. Add this to the file res/values/styles.xml (if it doesn't already exist, create it).&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;resources&amp;gt;
	&amp;lt;style name="AppTheme.Button" parent="@android:style/Widget.Button"&amp;gt;
		&amp;lt;item name="android:textSize"&amp;gt;12sp&amp;lt;/item&amp;gt;
		&amp;lt;item name="android:paddingLeft"&amp;gt;10dp&amp;lt;/item&amp;gt;
		&amp;lt;item name="android:paddingRight"&amp;gt;10dp&amp;lt;/item&amp;gt;
	&amp;lt;/style&amp;gt;
&amp;lt;/resources&amp;gt;&lt;/pre&gt;&lt;p&gt;This style has the parent attribute set to the Button widget. What this means is that our custom theme will inherit all the style definitions of a standard button. So if we declare nothing in our style, then our button will look exactly the same as the standard button. In this case we override the text and padding properties.&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;Button
	style="@style/AppTheme.Button"
	android:text="@string/buttontext" /&amp;gt;&lt;/pre&gt;&lt;p&gt;What we did here is give a specific button in our application a custom style we’ve created. Something that might be more interesting than this is to give all the buttons in our application a custom look and feel. And the correct way to do this is not by changing the declaration of every single button in our app, but by creating a theme.&lt;/p&gt;
&lt;h2&gt;Declare and apply a theme&lt;/h2&gt;
&lt;p&gt;This is how to declare a theme:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;style name="AppTheme.Light" parent="@android:style/Theme.Holo.Light"&amp;gt;
	&amp;lt;item name="android:textSize"&amp;gt;14sp&amp;lt;/item&amp;gt;
	&amp;lt;item name="android:buttonStyle"&amp;gt;@style/AppTheme.Button&amp;lt;/item&amp;gt;
	&amp;lt;item name="android:editTextStyle"&amp;gt;@style/AppTheme.EditText&amp;lt;/item&amp;gt;
	&amp;lt;item name="listItemStyle"&amp;gt;@style/AppTheme.ListItemStyle&amp;lt;/item&amp;gt;
&amp;lt;/style&amp;gt;&lt;/pre&gt;&lt;p&gt;Place this in the same place as you would a normal style (res/values/styles.xml).&lt;/p&gt;
&lt;p&gt;Pretty much the same as the style declaration, but you might notice the difference in the parent attribute of the style. The parent here is an out of the box android theme.&lt;/p&gt;
&lt;p&gt;What you might also notice is the second item node. Here we’re declaring the buttonStyle which will be applied to all the buttons under this theme. You can see that we’re referencing the style we’ve created before.&lt;/p&gt;
&lt;p&gt;You can now apply this theme to an activity or to the whole application. You need to edit the AndroidManifest.xml file.&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;application android:theme="@style/AppTheme.Light"&amp;gt;
&amp;lt;activity android:theme="@style/AppTheme.Light "&amp;gt;&lt;/pre&gt;&lt;p&gt;Use one or the other, depending on the scope you need.&lt;/p&gt;
&lt;h2&gt;Style Inheritance&lt;/h2&gt;
&lt;p&gt;In our application we have two themes, a light and a dark one. Therefore we created two theme declarations.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/android101-8-light.png"&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/resize/content/android101-8-light-600x375.png" style="width: 600px; height: 375px; " width="600" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(Light)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/android101-8-dark.png"&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/resize/content/android101-8-dark-600x375.png" style="width: 600px; height: 375px; " width="600" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(Dark)&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(34, 34, 34); font-family: arial, sans-serif; line-height: normal; background-color: rgba(255, 255, 255, 0.917969); "&gt;&lt;br /&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;style name="AppTheme.Light" parent="@android:style/Theme.Holo.Light"&amp;gt;
	&amp;lt;item name="android:textSize"&amp;gt;14sp&amp;lt;/item&amp;gt;
	&amp;lt;item name="android:buttonStyle"&amp;gt;@style/AppTheme.Button&amp;lt;/item&amp;gt;
	&amp;lt;item name="android:editTextStyle"&amp;gt;@style/AppTheme.EditText&amp;lt;/item&amp;gt;
	&amp;lt;item name="listItemStyle"&amp;gt;@style/AppTheme.ListItemStyle&amp;lt;/item&amp;gt;
&amp;lt;/style&amp;gt;

&amp;lt;style name="AppTheme.Dark" parent="@android:style/Theme.Holo"&amp;gt;
	&amp;lt;item name="android:textSize"&amp;gt;14sp&amp;lt;/item&amp;gt;
	&amp;lt;item name="android:buttonStyle"&amp;gt;@style/AppTheme.Button&amp;lt;/item&amp;gt;
	&amp;lt;item name="android:editTextStyle"&amp;gt;@style/AppTheme.EditText&amp;lt;/item&amp;gt;
	&amp;lt;item name="listItemStyle"&amp;gt;@style/AppTheme.ListItemStyle.Dark&amp;lt;/item&amp;gt;
&amp;lt;/style&amp;gt;&lt;/pre&gt;&lt;p&gt;Besides the parent attribute you can use another declaration of inheritance through the naming convention. For instance, for the declaration of the dark theme widgets, we can inherit all the definitions from the light theme definition and only override what we need:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;style name="AppTheme.ListItemStyle.Dark"&amp;gt;
	&amp;lt;item name="android:background"&amp;gt;@color/list_item_dark&amp;lt;/item&amp;gt;
&amp;lt;/style&amp;gt;&lt;/pre&gt;&lt;p&gt;AppTheme.ListItemStyle.Dark is interpreted as an inheritance from the already defined AppTheme.ListItemStyle. This is a more structured and readable way to declare parenting relationships, especially if you have several themes or widget styles.&lt;/p&gt;
&lt;p&gt;See all available &lt;a href="http://developer.android.com/reference/android/R.style.html" style="color:inherit;text-decoration:inherit"&gt;Android widgets to override here&lt;/a&gt; &lt;a href="http://developer.android.com/reference/android/R.style.html" style="color:inherit;text-decoration:inherit"&gt;.&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Create a custom style for a View&lt;/h2&gt;
&lt;p&gt;One of the proprieties on the theme definition I showed you is the listItemStyle.&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;style name="AppTheme.Light" parent="@android:style/Theme.Holo.Light"&amp;gt;
	&amp;lt;item name="android:textSize"&amp;gt;14sp&amp;lt;/item&amp;gt;
	&amp;lt;item name="listItemStyle"&amp;gt;@style/AppTheme.ListItemStyle&amp;lt;/item&amp;gt;
&amp;lt;/style&amp;gt;

&amp;lt;style name="AppTheme.ListItemStyle"&amp;gt;
	&amp;lt;item name="android:background"&amp;gt;@color/list_item&amp;lt;/item&amp;gt;
&amp;lt;/style&amp;gt;&lt;/pre&gt;&lt;p&gt;I had to create this custom attribute value because I wanted to style a custom LinearLayout view differently for each of my themes and that option wasn’t available by default in the android namespace (as the android:textSize is).&lt;/p&gt;
&lt;p&gt;Here’s my view definition:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/feedListItem"
	android:layout_height="wrap_content"
	android:layout_width="fill_parent"
	style="?listItemStyle"&amp;gt;
	&amp;lt;ImageView android:id="@+id/picture"
		android:layout_height="100dip"
		android:layout_width="100dip"/&amp;gt;
	&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:id="@+id/user"
		android:orientation="vertical"
		android:layout_height="wrap_content"
		android:layout_width="fill_parent"
		android:padding="10dp"&amp;gt;
		&amp;lt;TextView android:id="@+id/textUsername"
			android:textAppearance="?android:attr/textAppearanceSmall"
			android:layout_height="wrap_content"
			android:layout_width="fill_parent"
			android:layout_gravity="center_horizontal"
			android:textStyle="bold"/&amp;gt;
		&amp;lt;TextView android:id="@+id/textContent"
			android:layout_height="fill_parent"
			android:layout_width="fill_parent"
			android:paddingTop="6dp"
			android:maxLines="3"/&amp;gt;
	&amp;lt;/LinearLayout&amp;gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&lt;p&gt;Notice the style attribute in the parent LinearLayout.&lt;/p&gt;
&lt;p&gt;Last thing we need to do for this to work is declare the new attribute value. Otherwise you’ll get an error saying the attribute doesn’t exist:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/content/android101-8-error.png" style="width: 470px; height: 25px; " width="470" height="25" /&gt;&lt;/p&gt;
&lt;p&gt;Under res/values/attrs.xml create a new declaration:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;resources&amp;gt;
	&amp;lt;attr name="listItemStyle" format="reference" /&amp;gt;
&amp;lt;/resources&amp;gt;&lt;/pre&gt;&lt;h2&gt;Change the Style or Theme at runtime&lt;/h2&gt;
&lt;p&gt;Since we had two different themes, we wanted to allow the user to change the active theme through the preferences.&lt;/p&gt;
&lt;p&gt;We save the selected preference in the application’s &lt;a href="http://developer.android.com/guide/topics/data/data-storage.html#pref"&gt;SharedPreferences&lt;/a&gt; and load it in the Activity’s onCreate method.&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	SharedPreferences prefs = HoneybuzzApplication.getSharedPreferences();
	String themeName = prefs.getString(HoneybuzzApplication.PREFERENCE_THEME, "AppTheme.Light");
	int themeId = getResources().getIdentifier(themeName, "style", getPackageName());
	setTheme(themeId);
}&lt;/pre&gt;&lt;p&gt;You need to do this for every Activity or you can do as we did and create parent Activity that handles all the cross-app customizations. All our other Activities inherit form it.&lt;/p&gt;
&lt;p&gt;We also need to reload the app theme after the user changes the settings. We do this in our parent Activity:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
// handle updates to preferences
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
	if (key.equals(HoneybuzzApplication.PREFERENCE_THEME)) {
		// recreate activity so theme gets updated
		this.recreate();
	}
}&lt;/pre&gt;&lt;h2&gt;More resources&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/topics/ui/themes.html"&gt;Styles and Themes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://brainflush.wordpress.com/2009/03/15/understanding-android-themes-and-styles/"&gt;Understanding Android Themes And Styles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-use-fragments-handle-different-screen-orientations"&gt;Use Fragments to handle different screen orientations&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=OHEFohNtIMo:KM2BKj5iO0E:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=OHEFohNtIMo:KM2BKj5iO0E:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=OHEFohNtIMo:KM2BKj5iO0E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=OHEFohNtIMo:KM2BKj5iO0E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=OHEFohNtIMo:KM2BKj5iO0E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=OHEFohNtIMo:KM2BKj5iO0E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=OHEFohNtIMo:KM2BKj5iO0E:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=OHEFohNtIMo:KM2BKj5iO0E:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=OHEFohNtIMo:KM2BKj5iO0E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=OHEFohNtIMo:KM2BKj5iO0E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=OHEFohNtIMo:KM2BKj5iO0E:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/OHEFohNtIMo" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 30 Nov 2011 09:15:55 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">118 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-styles-and-themes</feedburner:origLink></item>
<item>
 <title>Android 101: How to create an options menu for the Action Bar</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/_6JwRFYhp04/android-101-how-create-options-menu-action-bar</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Na_8OXhGGK_PvwYuu7k6eifFzkw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Na_8OXhGGK_PvwYuu7k6eifFzkw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Na_8OXhGGK_PvwYuu7k6eifFzkw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Na_8OXhGGK_PvwYuu7k6eifFzkw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;Android Development Guide&lt;/a&gt;. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-storing-and-retrieving-user-preferences"&gt;Storing and retrieving user preferences&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A menu is useful to provide access to different parts of your application. It's easy to add a menu to an Android application. Let's see how to do it.&lt;/p&gt;
&lt;h2&gt;Create a menu resource file&lt;/h2&gt;
&lt;p&gt;The first step is to create a &lt;strong&gt;menu&lt;/strong&gt; folder under the &lt;strong&gt;res&lt;/strong&gt; folder of your application.&lt;/p&gt;
&lt;p&gt;Then add a new Android XML File.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/new_menu.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/new_menu-200x217.png" style="width: 200px; height: 217px; " width="200" height="217" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Define individual options using the &lt;strong&gt;item&lt;/strong&gt; element. Specify the &lt;strong&gt;id&lt;/strong&gt;, &lt;strong&gt;icon&lt;/strong&gt; and &lt;strong&gt;title&lt;/strong&gt; for each option. Here is the menu file for the Honeybuzz application:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;menu
  xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;
    &amp;lt;item android:id="@+id/menuRefresh"
          android:icon="@android:drawable/ic_popup_sync"
          android:title="@string/menu_refresh"
          android:alphabeticShortcut="r"
          android:showAsAction="always" /&amp;gt;
    &amp;lt;item android:id="@+id/menuProgress"
          android:actionLayout="@layout/progress"
          android:showAsAction="always" /&amp;gt;
    &amp;lt;item android:id="@+id/menuNewBuzz"
          android:icon="@android:drawable/ic_input_add"
          android:title="@string/menu_new_buzz"
          android:alphabeticShortcut="n"
          android:showAsAction="ifRoom|withText" /&amp;gt;
    &amp;lt;item android:id="@+id/menuAccounts"
          android:icon="@android:drawable/ic_lock_lock"
          android:title="@string/menu_accounts"
          android:alphabeticShortcut="a"
          android:showAsAction="withText" /&amp;gt;
    &amp;lt;item android:id="@+id/menuPreferences"
          android:icon="@android:drawable/ic_menu_preferences"
          android:title="@string/menu_preferences"
          android:alphabeticShortcut="s"
          android:showAsAction="withText" /&amp;gt;
    &amp;lt;item android:id="@+id/menuAbout"
          android:icon="@android:drawable/ic_menu_info_details"
          android:title="@string/menu_about"
          android:alphabeticShortcut="b"
          android:showAsAction="withText" /&amp;gt;
&amp;lt;/menu&amp;gt;&lt;/pre&gt;&lt;p&gt;The &lt;strong&gt;showAsAction&lt;/strong&gt; attribute allows you to specify when and how the option appears in the &lt;strong&gt;ActionBar&lt;/strong&gt; (the &lt;strong&gt;ActionBar&lt;/strong&gt; is the title bar that appears on top of an Android application starting with Honeycomb). Available values are: &lt;strong&gt;ifRoom&lt;/strong&gt;, &lt;strong&gt;withText&lt;/strong&gt;, &lt;strong&gt;never&lt;/strong&gt; and &lt;strong&gt;always&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_options_menu.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_options_menu-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Inflate the menu and handle menu options&lt;/h2&gt;
&lt;p&gt;Next you want to update the &lt;strong&gt;Activity&lt;/strong&gt; where you want the menu to appear. You need to override &lt;strong&gt;onCreateOptionsMenu &lt;/strong&gt;for inflating your menu file and override &lt;strong&gt;onOptionsItemSelected &lt;/strong&gt;for handling the menu options. Here is how we build the menu for the Honeybuzz applcation:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
	this.menuHandler = menu;

	MenuInflater inflater = getMenuInflater();
	inflater.inflate(R.menu.menu, menu);
	hideProgress();

	return super.onCreateOptionsMenu(menu);
}

public void showProgress() {
	this.menuHandler.findItem(R.id.menuRefresh).setVisible(false);
	this.menuHandler.findItem(R.id.menuProgress).setVisible(true);
}

public void hideProgress() {
	this.menuHandler.findItem(R.id.menuProgress).setVisible(false);
	this.menuHandler.findItem(R.id.menuRefresh).setVisible(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
		case android.R.id.home:
			// go home
			Intent intent = new Intent(this, HoneybuzzListActivity.class);
			intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
			startActivity(intent);
			return true;
		case R.id.menuNewBuzz:
			startActivity(new Intent(this, HoneybuzzAddActivity.class));
			return true;
		case R.id.menuAccounts:
			showDialog(DIALOG_ACCOUNTS);
			return true;
		case R.id.menuPreferences:
			startActivity(new Intent(this, HoneybuzzPreferences.class));
			return true;
		case R.id.menuRefresh:
			// refresh buzzes (handled on child Activity)
			return true;
			case R.id.menuAbout:
			loadAboutDialog(getString(R.string.about_title));
			return true;
	}

	return super.onOptionsItemSelected(item);
}&lt;/pre&gt;&lt;p&gt;The Action Bar appears by default in Honeycomb. It sits at the top of the screen and includes the application's icon. The menu will be added to the Action Bar and depending on the settings of each option, some options will appear as buttons with only an icon, while the remainder will be available as text options via a dropdown.&lt;/p&gt;
&lt;p&gt;For each option selected we usually start a new &lt;strong&gt;Activity&lt;/strong&gt;. Because most &lt;strong&gt;Activities&lt;/strong&gt; will inherit from this main &lt;strong&gt;Activity&lt;/strong&gt;, they will also share the same menu. The &lt;strong&gt;showProgress&lt;/strong&gt;/&lt;strong&gt;hideProgress&lt;/strong&gt; methods are called when the application is busy processing information. There is a refresh button that can be clicked to reload the data and when the application is processing the refresh button will be replaced by a progress indicator.&lt;/p&gt;
&lt;p&gt;For handling the home button (the icon button of your application that sits at the top left) you compare the item ID to &lt;strong&gt;android.R.id.home&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;h2&gt;How to generate icons for menu options and the Action Bar&lt;/h2&gt;
&lt;p&gt;To display your menu options you will generally want an icon. You have to build several images to accommodate for different screen sizes. The &lt;a href="http://android-ui-utils.googlecode.com/hg/asset-studio/dist/index.html"&gt;Android Asset Studio&lt;/a&gt; is a useful utility that generates the different image files. You have to provide an image or select one from the clipart gallery and you can provide text as well. There are a few other configuration options (padding, trim, theme) and at the end you can download a zip archive with all the images.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://android-ui-utils.googlecode.com/hg/asset-studio/dist/index.html"&gt;Android Asset Studio&lt;/a&gt; can also be used for generating icons for other parts of your application (launcher, action bar, etc.) and is part of the &lt;a href="http://code.google.com/p/android-ui-utils/"&gt;android-ui-utils&lt;/a&gt;, which also provides Photoshop icon templates that follow the icon design guidelines for Android.&lt;/p&gt;
&lt;p&gt;Besides creating your own icons you can also use Android's own icons. Android comes with a set of drawables that can be used in many different situations. For example, for Froyo (Android 2.2) you can check the &lt;a href="http://androiddrawableexplorer.appspot.com/"&gt;Android Drawables explorer&lt;/a&gt; to see what is available. You access these resources like this: &lt;strong&gt;android.R.drawable.ic_menu_save&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For checking the drawables available in Honeycomb (or any other version) I recommend that you add an &lt;strong&gt;ImageView&lt;/strong&gt; to a layout file, using the "Graphical Layout" view. Then if you choose "System Resources" you will see all the available options as well as a preview image.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/system_drawables.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/system_drawables-200x182.png" style="width: 200px; height: 182px; " width="200" height="182" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;More resources&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/topics/ui/menus.html"&gt;Creating Menus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/guide/topics/ui/actionbar.html"&gt;Using the Action Bar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-styles-and-themes"&gt;Styles and Themes&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=_6JwRFYhp04:T6qQ7NRaaTs:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=_6JwRFYhp04:T6qQ7NRaaTs:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=_6JwRFYhp04:T6qQ7NRaaTs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=_6JwRFYhp04:T6qQ7NRaaTs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=_6JwRFYhp04:T6qQ7NRaaTs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=_6JwRFYhp04:T6qQ7NRaaTs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=_6JwRFYhp04:T6qQ7NRaaTs:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=_6JwRFYhp04:T6qQ7NRaaTs:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=_6JwRFYhp04:T6qQ7NRaaTs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=_6JwRFYhp04:T6qQ7NRaaTs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=_6JwRFYhp04:T6qQ7NRaaTs:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/_6JwRFYhp04" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 28 Nov 2011 07:53:41 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">125 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-how-create-options-menu-action-bar</feedburner:origLink></item>
<item>
 <title>Android 101: Storing and retrieving user preferences</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/AaxjFir1iDI/android-101-storing-and-retrieving-user-preferences</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0IboRr9vAXXwj6LeDeupw4MWoq0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0IboRr9vAXXwj6LeDeupw4MWoq0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0IboRr9vAXXwj6LeDeupw4MWoq0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0IboRr9vAXXwj6LeDeupw4MWoq0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;Android Development Guide&lt;/a&gt;. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-using-google-analytics-your-android-application"&gt;Using Google Analytics in your Android application&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Letting users customize an application to their liking is one of the most basic features of an application. In this article we will describe how you can build a preferences screen for your Android application and how to store and retrieve user preferences.&lt;/p&gt;
&lt;h2&gt;How to create a preferences screen in Android&lt;/h2&gt;
&lt;p&gt;You can create a preferences screen by following these easy steps:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Create an &lt;strong&gt;xml&lt;/strong&gt; folder under your &lt;strong&gt;res&lt;/strong&gt; folder.&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;preferences.xml&lt;/strong&gt; file (specify that it is a resource of type &lt;strong&gt;Preference&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_preferences_xml_create.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_preferences_xml_create-200x216.png" style="width: 200px; height: 216px; " width="200" height="216" /&gt;&lt;/a&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_preferences_xml_create2.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_preferences_xml_create2-200x195.png" style="width: 200px; height: 195px; " width="200" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The root element of your preferences file should be a &lt;strong&gt;PreferenceScreen&lt;/strong&gt;. Now you will need to add all the different options to the preferences.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Use &lt;strong&gt;PreferenceCategory&lt;/strong&gt; to divide the options into meaningful groups.&lt;/li&gt;
&lt;li&gt;Use the different preference widgets to specify each option, such as &lt;strong&gt;CheckBoxPreference&lt;/strong&gt;, &lt;strong&gt;ListPreference&lt;/strong&gt; and &lt;strong&gt;EditTextPreference&lt;/strong&gt;, among others.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;For each setting you will need to specify at least a key, a title and a summary. You can also specify default values, persistence options and other specific properties for each different widget.&lt;/p&gt;
&lt;p&gt;Here is an example of the preferences file from the Honeybuzz application:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;
    &amp;lt;PreferenceCategory android:title="@string/pref_category_design"&amp;gt;
        &amp;lt;ListPreference
            android:title="@string/pref_theme_title"
            android:summary="@string/pref_theme_summary"
            android:key="honeybuzz.theme"
            android:persistent="true"
            android:defaultValue="AppTheme.Light"
            android:entries="@array/themeNames"
            android:entryValues="@array/themeValues" /&amp;gt;
    &amp;lt;/PreferenceCategory&amp;gt;
    &amp;lt;PreferenceCategory android:title="@string/pref_category_service"&amp;gt;
        &amp;lt;ListPreference
            android:title="@string/pref_interval_title"
            android:summary="@string/pref_interval_summary"
            android:key="honeybuzz.interval"
            android:persistent="true"
            android:defaultValue="30"
            android:entries="@array/intervalNames"
            android:entryValues="@array/intervalValues" /&amp;gt;
    &amp;lt;/PreferenceCategory&amp;gt;
    &amp;lt;PreferenceCategory android:title="@string/pref_category_error"&amp;gt;
        &amp;lt;CheckBoxPreference android:key="acra.enable"
            android:persistent="true"
            android:title="@string/pref_disable_acra"
            android:summaryOn="@string/pref_acra_enabled"
            android:summaryOff="@string/pref_acra_disabled"
            android:defaultValue="true"/&amp;gt;
        &amp;lt;CheckBoxPreference android:key="acra.syslog.enable"
            android:persistent="true"
            android:title="@string/pref_acra_syslog"
            android:summaryOn="@string/pref_acra_syslog_enabled"
            android:summaryOff="@string/pref_acra_syslog_disabled"
            android:defaultValue="true"/&amp;gt;
        &amp;lt;CheckBoxPreference android:key="acra.alwaysaccept"
            android:persistent="true"
            android:title="@string/pref_acra_alwaysaccept"
            android:summaryOn="@string/pref_acra_alwaysaccept_enabled"
            android:summaryOff="@string/pref_acra_alwaysaccept_disabled"
            android:defaultValue="false"/&amp;gt;
    &amp;lt;/PreferenceCategory&amp;gt;
&amp;lt;/PreferenceScreen&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;strong&gt;ListPreferences&lt;/strong&gt; only works with string arrays. Don't try to use integer arrays (or any other kind) with &lt;strong&gt;ListPreferences&lt;/strong&gt; or you will see an ugly error.&lt;/p&gt;
&lt;h2&gt;Create a preferences Activity&lt;/h2&gt;
&lt;p&gt;Now that the preferences screen is defined, you need to create an &lt;strong&gt;Activy&lt;/strong&gt; to display it, by inheriting from &lt;strong&gt;PreferenceActivity&lt;/strong&gt; and adding the preferences from the resource file.&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
package com.quasibit.honeybuzz;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class HoneybuzzPreferences extends PreferenceActivity {
      @Override 
      public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 

        PreferenceManager prefMgr = getPreferenceManager();
        prefMgr.setSharedPreferencesName(HoneybuzzApplication.PREFERENCES_NAME);
        prefMgr.setSharedPreferencesMode(HoneybuzzApplication.PREFERENCES_MODE);
        
        addPreferencesFromResource(R.xml.preferences); 
      }
}&lt;/pre&gt;&lt;p&gt;We also specify a shared preferences name and mode.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;p&gt;In the application's main class we define the preferences' constants and we set the default values for the &lt;strong&gt;PreferenceManager&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
public class HoneybuzzApplication extends Application {
    public static final String PREFERENCES_NAME = "HoneybuzzPrefs";
    public static final int PREFERENCES_MODE = MODE_PRIVATE;

    public static final String PREFERENCE_THEME = "honeybuzz.theme";
    public static final String PREFERENCE_ISFIRSTUSE = "honeybuzz.firstuse";
    public static final String PREFERENCE_INTERVAL = "honeybuzz.interval";
    
    @Override
    public void onCreate() {
        ...

        PreferenceManager.setDefaultValues(this, PREFERENCES_NAME, PREFERENCES_MODE, R.xml.preferences, false); // set default preferences
        super.onCreate();
    }

    public static SharedPreferences getSharedPreferences() {
        return getInstance().getSharedPreferences(PREFERENCES_NAME, PREFERENCES_MODE);
    }
}&lt;/pre&gt;&lt;p&gt;To start the preferences &lt;strong&gt;Activity&lt;/strong&gt;, we added it to the application's menu and we call it using:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
startActivity(new Intent(this, HoneybuzzPreferences.class));&lt;/pre&gt;&lt;p&gt;The final result looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_prefences_0.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_prefences_0-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;How to retrieve preferences&lt;/h2&gt;
&lt;p&gt;Because we added a helper method to the application's main class, we will use it to retrieve the user's preferences.&lt;/p&gt;
&lt;p&gt;In this example we retrieve the user's selected theme:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
SharedPreferences prefs = HoneybuzzApplication.getSharedPreferences();
String themeName = prefs.getString(HoneybuzzApplication.PREFERENCE_THEME, "AppTheme.Light");&lt;/pre&gt;&lt;p&gt;Retrieving preferences this way becomes very simple.&lt;/p&gt;
&lt;h2&gt;SeekBarPreference&lt;/h2&gt;
&lt;p&gt;Soon you will find out that there is no &lt;strong&gt;SeekBarPreference&lt;/strong&gt; widget. This is a very common type that is useful in many cases and is requested a lot. A &lt;strong&gt;SeekBarPreference&lt;/strong&gt; is basically a slider, useful for numerical settings or of other kinds.&lt;/p&gt;
&lt;p&gt;Fortunately for you, a lot of people have already been through that and they were kind enough to share it with the public.&lt;/p&gt;
&lt;p&gt;I have found many different examples and each one is different, so you might as well check several of them if you are in need of such a widget:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://android.hlidskialf.com/blog/code/android-seekbar-preference"&gt;SeekBarPreference from Hlidskialf Android Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/android/seekbar_preference.aspx"&gt;SeekBar Preference by Mike in CodeProject&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-journey.blogspot.com/2010/01/for-almost-any-application-we-need-to.html"&gt;Android Preferences from Android &amp;amp; Amir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cmwmobile.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=15&amp;amp;Itemid=16"&gt;How to create a SeekBarDialogPreference at CMW Mobile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;More resources&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/acra/wiki/AdvancedUsage#Letting_your_users_control_ACRA"&gt;Letting your users control ACRA&lt;/a&gt; (how to add ACRA's configuration options to your preferences screen)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kaloer.com/android-preferences"&gt;Android Preferences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mobdev.olin.edu/mobdevwiki/FrontPage/Tutorials/Preferences"&gt;Steps to Adding Preferences to Your Application&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-how-create-options-menu-action-bar"&gt;How to create an options menu for the Action Bar&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=AaxjFir1iDI:cxa9wg50rko:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=AaxjFir1iDI:cxa9wg50rko:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=AaxjFir1iDI:cxa9wg50rko:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=AaxjFir1iDI:cxa9wg50rko:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=AaxjFir1iDI:cxa9wg50rko:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=AaxjFir1iDI:cxa9wg50rko:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=AaxjFir1iDI:cxa9wg50rko:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=AaxjFir1iDI:cxa9wg50rko:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=AaxjFir1iDI:cxa9wg50rko:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=AaxjFir1iDI:cxa9wg50rko:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=AaxjFir1iDI:cxa9wg50rko:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/AaxjFir1iDI" height="1" width="1"/&gt;</description>
 <pubDate>Fri, 25 Nov 2011 07:39:38 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">123 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-storing-and-retrieving-user-preferences</feedburner:origLink></item>
<item>
 <title>Android 101: Using Google Analytics in your Android application</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/zZ3rivGLEgw/android-101-using-google-analytics-your-android-application</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aIPsEIhZBN7g8J8jjTsgKme8lbU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aIPsEIhZBN7g8J8jjTsgKme8lbU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aIPsEIhZBN7g8J8jjTsgKme8lbU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aIPsEIhZBN7g8J8jjTsgKme8lbU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;Android Development Guide&lt;/a&gt;. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-error-handling-and-reporting"&gt;Error handling and reporting&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Analytics will help you understand which parts of your application are most popular and where users get stuck the most. Google Analytics is not only for websites, it can also be used for Android applications.&lt;/p&gt;
&lt;h2&gt;Installing Google Analytics in your Android project&lt;/h2&gt;
&lt;p&gt;To add Google Analytics support in your Android application you need to follow these steps:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/mobile/analytics/download.html#Google_Analytics_SDK_for_Android"&gt;Download the Google Analytics SDK&lt;/a&gt; for Android.&lt;/li&gt;
&lt;li&gt;Add the library &lt;strong&gt;libGoogleAnalytics.jar&lt;/strong&gt; to your project. For how to do that refer to the article &lt;a href="http://www.broculos.net/en/article/android-101-development-environment-and-project-creation#libraries"&gt;Development environment and project creation&lt;/a&gt; (see the part about adding external libraries).&lt;/li&gt;
&lt;li&gt;Add the necessary permissions to your Android manifest.&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="brush:xml;"&gt;
&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&amp;gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Go to your &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; account and create a (fake) website profile. Make sure to choose a descriptive URL.
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/honeybuzz_ga_id.png"&gt;&lt;img src="http://www.broculos.net/sites/default/files/resize/content/honeybuzz_ga_id-200x124.png" style="width: 200px; height: 124px; " width="200" height="124" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;You will have to indicate to your users, either somewhere in the application or in your terms of service, that you are tracking them anonymously.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Tracking a referrer install&lt;/h3&gt;
&lt;p&gt;An important part of your application's analytics is to know the source of the application install (in case you're using an advertisement, for example, or if you have several installation links in different websites).&lt;/p&gt;
&lt;p&gt;To be able to track that you need to use a link with the following format:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://market.android.com/search?q=pname:&amp;lt;package&amp;gt;&amp;amp;referrer=&amp;lt;referral&amp;gt;"&gt;http://market.android.com/search?q=pname:&amp;lt;package&amp;gt;&amp;amp;referrer=&amp;lt;referral&amp;gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;package&amp;gt; is the name of your application's package.&lt;/li&gt;
&lt;li&gt;&amp;lt;referral&amp;gt; is a campaign specific information.&lt;/li&gt;
&lt;li&gt;You can generate URLs using the &lt;a href="http://code.google.com/mobile/analytics/docs/android/#android-market-tracking"&gt;Android Market Campaign Tracking&lt;/a&gt; tool.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You also need to add this to your application's manifest:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;application&amp;gt;

    &amp;lt;!-- Used for install referrer tracking (analytics) --&amp;gt;
    &amp;lt;receiver android:name="com.google.android.apps.analytics.AnalyticsReceiver"
              android:exported="true"&amp;gt;
      &amp;lt;intent-filter&amp;gt;
        &amp;lt;action android:name="com.android.vending.INSTALL_REFERRER" /&amp;gt;
      &amp;lt;/intent-filter&amp;gt;
    &amp;lt;/receiver&amp;gt;

&amp;lt;/application&amp;gt;&lt;/pre&gt;&lt;h2&gt;Adding analytics tracking to your Activities&lt;/h2&gt;
&lt;p&gt;You can use the &lt;strong&gt;GoogleAnalyticsTracker&lt;/strong&gt; to track page views and events in your application. A simple example:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
GoogleAnalyticsTracker tracker = GoogleAnalyticsTracker.getInstance();
tracker.start(“your analytics tracking ID”, 20, this);
tracker.trackPageView("/welcome");
this.tracker.trackEvent("Category", "Action", "Label", "Value");
tracker.setCustomVar(1, "Name", "Value"); // first parameter is the slot (1 to 5)&lt;/pre&gt;&lt;p&gt;To save battery life, tracked data is only dispatched at certain intervals (in the above example, every 20 seconds), but you can also dispatch it manually by using the &lt;strong&gt;tracker.dispatch()&lt;/strong&gt; method.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;p&gt;To make our life easier, instead of manually adding code to all Activities, I created a class (from which all Activities will inherit) that not only tracks the current Activity, but also provides useful methods for tracking events and custom vars.&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
package com.quasibit.honeybuzz;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;

import com.google.android.apps.analytics.GoogleAnalyticsTracker;

public class TrackedActivity extends Activity {
    private static final String TRACKER_ID = "your analytics tracking ID ";
    private static final boolean DISPATCH_MANUAL = false;
    private static final int DISPATCH_INTERVAL = 20;
    private static final boolean DEBUG = false; // If true stores analytics requests in the log cat
    private static final boolean DRY_RUN = false; // If true only stores data locally (doesn't send data to analytics)

    @SuppressWarnings("unused")
    private static final int SCOPE_VISITOR = 1; // Call the first time your application is run on a device. Useful for anything that won't change during the lifetime of the installation of the application (app version, lite vs full, type of phone).
    
    @SuppressWarnings("unused")
    private static final int SCOPE_SESSION = 2; // Call at the beginning of an Activity. Applies to all pageviews and events for the lifecycle of the activity.
    
    @SuppressWarnings("unused")
    private static final int SCOPE_PAGE = 3; // Call before trackEvent or trackPageView that the custom variable should apply to.
    
    @SuppressWarnings("unused")
    private static final int SLOT_1 = 1;
    
    @SuppressWarnings("unused")
    private static final int SLOT_2 = 2;
    
    @SuppressWarnings("unused")
    private static final int SLOT_3 = 3;
    
    @SuppressWarnings("unused")
    private static final int SLOT_4 = 4;
    
    @SuppressWarnings("unused")
    private static final int SLOT_5 = 5;
    
    private GoogleAnalyticsTracker tracker;
    private String pageId;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.pageId = getClass().getSimpleName();
        this.tracker = GoogleAnalyticsTracker.getInstance();
        
        if (DISPATCH_MANUAL) {
            this.tracker.start(TRACKER_ID, this);
        } else {
            this.tracker.start(TRACKER_ID, DISPATCH_INTERVAL, getApplicationContext());
        }
        this.tracker.setDebug(DEBUG);
        this.tracker.setDryRun(DRY_RUN);
    }

    @Override
    protected void onResume() {
        super.onResume();

        this.tracker.trackPageView("/" + this.pageId);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.tracker.dispatch();
        this.tracker.stop();
    }

    public void dispatch() {
        if (this.tracker != null) {
            this.tracker.dispatch();
        }
    }

    public static void dispatch(final Context baseContext) {
        final GoogleAnalyticsTracker tracker = GoogleAnalyticsTracker.getInstance();
        tracker.start(TRACKER_ID, baseContext);
        tracker.dispatch();
        tracker.stop();
    }

    protected void trackPage(final String page) {
        this.tracker.trackPageView(page);
    }

    protected void trackEvent(final String category, final String action, final String label, final int value) {
        this.tracker.trackEvent(category, action, label, value);
    }

    protected void trackEvent(final String category, final String action, final String label) {
        trackEvent(category, action, label, 0);
    }

    protected void trackEvent(final String action, final String label, final int value) {
        this.tracker.trackEvent(this.pageId, action, label, value);
    }

    protected void trackEvent(final String action, final String label) {
        trackEvent(this.pageId, action, label, 0);
    }

    protected void setCustomVar(final int slot, final String name, final String value, final int scope) {
        this.tracker.setCustomVar(slot, name, value, scope);
    }

    protected void setCustomVar(final int slot, final String name, final String value) {
        this.tracker.setCustomVar(slot, name, value);
    }
}&lt;/pre&gt;&lt;p&gt;Because we will also be using Fragments, a TrackedFragment class was also built.&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
package com.quasibit.honeybuzz;

import com.google.android.apps.analytics.GoogleAnalyticsTracker;

import android.app.Fragment;
import android.os.Bundle;

public class TrackedFragment extends Fragment {
    private GoogleAnalyticsTracker tracker;
    private String activityId;
    private String fragmentId;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.tracker = GoogleAnalyticsTracker.getInstance();
        this.fragmentId = getClass().getSimpleName();
        this.activityId = getActivity().getClass().getSimpleName();
    }
    
    @Override
    public void onResume() {
        super.onResume();
        this.tracker.trackPageView("/" + this.activityId + "/" + this.fragmentId);
    }
}&lt;/pre&gt;&lt;p&gt;For more information on how to use Google Analytics in Android be sure to watch the Google I/O session on &lt;a href="http://www.google.com/events/io/2011/sessions/optimizing-android-apps-with-google-analytics.html"&gt;Optimizing Android Apps with Google Analytics&lt;/a&gt;. Another good resource is the article &lt;a href="http://android-developers.blogspot.com/2010/12/analytics-for-android-apps.html"&gt;Analytics for Android Apps&lt;/a&gt; that was published in the Android Developers blog.&lt;/p&gt;
&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-storing-and-retrieving-user-preferences"&gt;Storing and retrieving user preferences&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=zZ3rivGLEgw:VhNfy8LtZHc:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=zZ3rivGLEgw:VhNfy8LtZHc:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=zZ3rivGLEgw:VhNfy8LtZHc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=zZ3rivGLEgw:VhNfy8LtZHc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=zZ3rivGLEgw:VhNfy8LtZHc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=zZ3rivGLEgw:VhNfy8LtZHc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=zZ3rivGLEgw:VhNfy8LtZHc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=zZ3rivGLEgw:VhNfy8LtZHc:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=zZ3rivGLEgw:VhNfy8LtZHc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=zZ3rivGLEgw:VhNfy8LtZHc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=zZ3rivGLEgw:VhNfy8LtZHc:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/zZ3rivGLEgw" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 23 Nov 2011 10:22:58 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">121 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-using-google-analytics-your-android-application</feedburner:origLink></item>
<item>
 <title>Android 101: Error handling and reporting</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/VwEkvnk-c_Y/android-101-error-handling-and-reporting</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-05x82OrVrr2HRMe7v4u8QBaxSg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-05x82OrVrr2HRMe7v4u8QBaxSg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-05x82OrVrr2HRMe7v4u8QBaxSg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-05x82OrVrr2HRMe7v4u8QBaxSg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;Android Development Guide&lt;/a&gt;. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://broculos.net/en/article/android-101-working-google-buzz-api"&gt;Working with Google Buzz API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Error handling and reporting is an important aspect of an application because not only will you be aware of the more troublesome areas of your application, but you will also be able to provide a graceful experience in the event that your application crashes.&lt;/p&gt;
&lt;p&gt;A very popular library for handling exceptions in Android is &lt;a href="http://code.google.com/p/acra/"&gt;ACRA&lt;/a&gt;. ACRA will provide you with detailed crash reports and will store everything in a Google Doc form (or using a custom server script or even an email - but a Google Doc is a very handy and quick-to-setup solution).&lt;/p&gt;
&lt;p&gt;Furthermore ACRA is customizable in the way that it is presented to the user: you can either have silent errors and background reporting or, on the other hand, provide the user with the option of sending an error report with a short description.&lt;/p&gt;
&lt;p&gt;Starting with Froyo, crash reports are sent to the developer using the Android Market (if a user chooses to send them), but I find that ACRA is more customizable and provides accurate reports.&lt;/p&gt;
&lt;h2&gt;Setting up a Google Spreadsheet for ACRA reporting&lt;/h2&gt;
&lt;p&gt;You can read a detailed &lt;a href="http://code.google.com/p/acra/wiki/BasicSetup"&gt;ACRA setup guide&lt;/a&gt; on the Google project site. I will just briefly describe the procedure with a few notes of my own.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Download the latest version from the &lt;a href="http://code.google.com/p/acra/"&gt;ACRA&lt;/a&gt; site.&lt;/li&gt;
&lt;li&gt;Go to &lt;a href="https://docs.google.com"&gt;Google Docs&lt;/a&gt; and import the template &lt;em&gt;CrashReports-template.csv&lt;/em&gt;. Make sure conversion is enabled.
&lt;ul&gt;&lt;li&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_import.png"&gt;&lt;img src="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_import.png" style="width: 200px; height: 160px; " /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Open the new document and go to &lt;strong&gt;Tools&lt;/strong&gt; &amp;gt; &lt;strong&gt;Form&lt;/strong&gt; &amp;gt; &lt;strong&gt;Create a form&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Copy the &lt;strong&gt;formKey&lt;/strong&gt; value that is visible at the bottom of your form window.
&lt;ul&gt;&lt;li&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_formkey.png"&gt;&lt;img src="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_formkey.png" style="width: 200px; height: 166px; " /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Type something in the description so that you can save the form.&lt;/li&gt;
&lt;li&gt;If you want to receive an email notification each time an error report gets saved (or daily for example), you can edit the notification rules.
&lt;ul&gt;&lt;li&gt;On the old Google Docs interface you expand the &lt;strong&gt;Share&lt;/strong&gt; dropdown and you will see the option there.&lt;/li&gt;
&lt;li&gt;On the new Google Docs interface you go to &lt;strong&gt;Tools&lt;/strong&gt; &amp;gt; &lt;strong&gt;Notification rules...&lt;/strong&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_notifications.png"&gt;&lt;img src="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_notifications.png" style="width: 200px; height: 155px; " /&gt;&lt;/a&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_notifications_rules.png"&gt;&lt;img src="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_notifications_rules.png" style="width: 200px; height: 157px; " /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;To have a better display of the error messages I advise you to resize the width of the columns and change the alignment as such:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_align.png"&gt;&lt;img src="http://broculos.net/sites/default/files/content/honeybuzz_acra_gdocs_align.png" style="width: 200px; height: 99px; " /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Adding ACRA to your project&lt;/h2&gt;
&lt;p&gt;Add the ACRA library to your project. Follow the same instructions provided in the article &lt;a href="http://broculos.net/en/article/android-101-development-environment-and-project-creation#libraries"&gt;Android 101: Development environment and project creation&lt;/a&gt; (see the part about adding external libraries).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_acra_eclipse.png"&gt;&lt;img src="http://broculos.net/sites/default/files/content/honeybuzz_acra_eclipse.png" style="width: 200px; height: 183px; " /&gt;&lt;/a&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_acra_eclipse_jar.png"&gt;&lt;img src="http://broculos.net/sites/default/files/content/honeybuzz_acra_eclipse_jar.png" style="width: 260px; height: 183px; " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the most basic setup, you only need to specify an attribute in your Application class with the form key of your Google Spreadsheet. For this application, I went a little forward and specified a different set of options:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
@ReportsCrashes(formKey="your form key",
                mode = ReportingInteractionMode.NOTIFICATION,
                resToastText = R.string.crash_toast_text, // optional, displayed as soon as the crash occurs, before collecting data which can take a few seconds
                resNotifTickerText = R.string.crash_notif_ticker_text,
                resNotifTitle = R.string.crash_notif_title,
                resNotifText = R.string.crash_notif_text,
                resNotifIcon = android.R.drawable.stat_notify_error, // optional. default is a warning sign
                resDialogText = R.string.crash_dialog_text,
                resDialogIcon = android.R.drawable.ic_dialog_info, //optional. default is a warning sign
                resDialogTitle = R.string.crash_dialog_title, // optional. default is your application name
                resDialogCommentPrompt = R.string.crash_dialog_comment_prompt, // optional. when defined, adds a user text field input with this text resource as a label
                resDialogOkToast = R.string.crash_dialog_ok_toast, // optional. displays a Toast message when the user accepts to send a report.
                sharedPreferencesName = HoneybuzzApplication.PREFERENCES_NAME, // Name of the SharedPreferences that will host the acra.enable or acra.disable preference.
                sharedPreferencesMode = HoneybuzzApplication.PREFERENCES_MODE // The mode that you need for the SharedPreference file creation: Context.MODE_PRIVATE, Context.MODE_WORLD_READABLE or Context.MODE_WORLD_WRITEABLE.
                )
public class HoneybuzzApplication extends Application {
    public static final String PREFERENCES_NAME = "HoneybuzzPrefs";
    public static final int PREFERENCES_MODE = MODE_PRIVATE;

    @Override
    public void onCreate() {
        ACRA.init(this); // error reporting
        Logging.setLoggingLevel(); // logging level
        PreferenceManager.setDefaultValues(this, PREFERENCES_NAME, PREFERENCES_MODE, R.xml.preferences, false); // set default preferences
        super.onCreate();
    }
}&lt;/pre&gt;&lt;p&gt;Simply specifying the interaction mode for the error reporting, some custom strings and icons for the text in the dialogs and the preferences name so the users’ preferences get stored.&lt;/p&gt;
&lt;p&gt;There are three types of interaction in ACRA:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;SILENT: errors are sent without notifying users and the default crash report screen from Android is displayed (in Froyo or above).&lt;/li&gt;
&lt;li&gt;TOAST: a simple toast message is displayed to the user and the report is sent without confirmation.&lt;/li&gt;
&lt;li&gt;NOTIFICATION: a notification message pops up and the user has to explicitly send the error reports, with the option of specifying additional information.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;p&gt;Another nice feature is that your users can &lt;a href="http://code.google.com/p/acra/wiki/AdvancedUsage#Letting_your_users_control_ACRA"&gt;specify in the preferences of your application how they want the error reporting to occur&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Custom Logging class&lt;/h2&gt;
&lt;p&gt;I ended up creating a custom class, analogous to the &lt;strong&gt;android.utils.Log&lt;/strong&gt; class, to aggregate all the logging functionality: not only to write ACRA reports, but also to write to Android's logs (retrievable with the LogCat). This class is used throughout the application to log information messages as well as exceptions and errors.&lt;/p&gt;
&lt;p&gt;Depending on the logging level configured, reports will be reported to ACRA.&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
package com.quasibit.honeybuzz;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.acra.ErrorReporter;

import android.util.Log;

public class Logging {
    private static Level LOGGING_LEVEL = Level.ALL;
    private static final String TAG = "Honeybuzz";
    
    public static void setLoggingLevel() {
        Logger.getLogger("com.google.api.client").setLevel(LOGGING_LEVEL);
    }
    
    public static int e(String tag, String msg, Throwable tr) {
        acraReport(Level.SEVERE, tag, msg, tr);
        
        return Log.e(tag, msg, tr);
    }
    
    public static int e(String msg, Throwable tr) {
        return e(TAG, msg, tr);
    }
    
    public static int e(Throwable tr) {
        return e(TAG, tr.getMessage(), tr);
    }
    
    public static int w(String tag, String msg, Throwable tr) {
        acraReport(Level.WARNING, tag, msg, tr);
        
        return Log.w(tag, msg, tr);
    }
    
    public static int w(String msg, Throwable tr) {
        return w(TAG, msg, tr);
    }
    
    public static int w(String tag, String msg) {
        acraReport(Level.WARNING, tag, msg);
        
        return Log.w(tag, msg);
    }
    
    public static int w(String msg) {
        return w(TAG, msg);
    }
    
    public static int i(String tag, String msg, Throwable tr) {
        acraReport(Level.INFO, tag, msg, tr);
        
        return Log.i(tag, msg, tr);
    }
    
    public static int i(String msg, Throwable tr) {
        return i(TAG, msg, tr);
    }
    
    public static int i(String tag, String msg) {
        acraReport(Level.INFO, tag, msg);
        
        return Log.i(tag, msg);
    }
    
    public static int i(String msg) {
        return i(TAG, msg);
    }
    
    public static int d(String tag, String msg) {
        acraReport(Level.FINEST, tag, msg);
        
        return Log.d(tag, msg);
    }
    
    public static int d(String msg) {
        return d(TAG, msg);
    }

    public static int v(String tag, String msg, Throwable tr) {
        acraReport(Level.FINE, tag, msg, tr);
        
        return Log.v(tag, msg, tr);
    }
    
    public static int v(String msg, Throwable tr) {
        return v(TAG, msg, tr);
    }
    
    public static int v(String tag, String msg) {
        acraReport(Level.FINE, tag, msg);
        
        return Log.v(tag, msg);
    }
    
    public static int v(String msg) {
        return v(TAG, msg);
    }

    private static void acraReport(Level level, String tag, String msg, Throwable tr) {
        if (level.intValue() &amp;gt;= LOGGING_LEVEL.intValue()) {
            acraReport(level, tag, msg);
            // report exception to acra silently
            ErrorReporter.getInstance().handleSilentException(tr);
        }
    }
    
    private static void acraReport(Level level, String tag, String msg) {
        if (level.intValue() &amp;gt;= LOGGING_LEVEL.intValue()) {
            ErrorReporter.getInstance().putCustomData(level.getName() + ": " + tag, msg);
        }
    }
}&lt;/pre&gt;&lt;h2&gt;Analyzing ACRA reports&lt;/h2&gt;
&lt;p&gt;Google Spreadsheets doesn’t exactly provide a user friendly way of reading error reports. There are applications that are being built to make use of the error reports provided by ACRA. You can see a few examples in the &lt;a href="http://code.google.com/p/acra/wiki/Contribs"&gt;contributions page of the ACRA site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bugsense.com/"&gt;BugSense&lt;/a&gt;, for example, works well with ACRA. I haven't tried it yet, but it seems to have some great features and only requires minimal configuration.&lt;/p&gt;
&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-using-google-analytics-your-android-application"&gt;Using Google Analytics in your Android application&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VwEkvnk-c_Y:rJ-h8hXsNIc:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=VwEkvnk-c_Y:rJ-h8hXsNIc:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VwEkvnk-c_Y:rJ-h8hXsNIc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VwEkvnk-c_Y:rJ-h8hXsNIc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VwEkvnk-c_Y:rJ-h8hXsNIc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=VwEkvnk-c_Y:rJ-h8hXsNIc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VwEkvnk-c_Y:rJ-h8hXsNIc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=VwEkvnk-c_Y:rJ-h8hXsNIc:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VwEkvnk-c_Y:rJ-h8hXsNIc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=VwEkvnk-c_Y:rJ-h8hXsNIc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VwEkvnk-c_Y:rJ-h8hXsNIc:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/VwEkvnk-c_Y" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 21 Nov 2011 08:08:00 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">117 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-error-handling-and-reporting</feedburner:origLink></item>
<item>
 <title>Android 101: Working with Google Buzz API</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/yZZVlI8xOwM/android-101-working-google-buzz-api</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Vy3x19mMdsMRLIADhb1NjR5kDRQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vy3x19mMdsMRLIADhb1NjR5kDRQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Vy3x19mMdsMRLIADhb1NjR5kDRQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vy3x19mMdsMRLIADhb1NjR5kDRQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an Android Development Guide. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Previous: &lt;a href="http://www.broculos.net/en/article/android-101-development-environment-and-project-creation"&gt;Development environment and project creation&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;Google APIs&lt;/h2&gt;
&lt;p&gt;Google Buzz API is a part of the most recent family of Google APIs. This family is based on a new API infrastructure (more about this on this &lt;a href="http://www.google.com/events/io/2010/sessions/how-google-builds-apis.html"&gt;Google IO presentation: How Google builds APIs&lt;/a&gt; ). On top of this new infrastructure Google has created a number of &lt;a href="http://googlecode.blogspot.com/2011/05/google-apis-discovery-service-one-api.html"&gt;tools&lt;/a&gt; that help developers build their applications.&lt;/p&gt;
&lt;p&gt;As of October 2011, Google &lt;a href="http://googleblog.blogspot.com/2011/10/fall-sweep.html"&gt;announced&lt;/a&gt; it would be discontinuing Google Buzz and its API.&lt;/p&gt;
&lt;h2&gt;HTTP Transport&lt;/h2&gt;
&lt;p&gt;On Android you have a few options to make the HTTP transport of the messages to/from the Google service you are using (in our case it’s the Buzz service).&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;UrlFetchTransport - Google App Engine only&lt;/li&gt;
&lt;li&gt;NetHttpTransport - Included in Java and Android SDK. Preferred choice on Android since Gingerbread.&lt;/li&gt;
&lt;li&gt;ApacheTransport – Included in Android SDK. Preferred choice for older Android SDK’s up to Froyo&lt;/li&gt;
&lt;li&gt;AndroidHttp.newCompatibleTransport() – Picks NetHttpTransport or ApacheTransport depending on the SDK level.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;HTTP connections shouldn’t be performed in the main UI thread - you don’t want to freeze your main activity for an undetermined amount of time.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;h2&gt;JSON&lt;/h2&gt;
&lt;p&gt;JSON has a big focus on the new Google APIs. You should use it as parser/serializer to avoid out-of-memory errors that can be caused by trying to load a JSON response as an object. There are a few choices for the JSON parser/serializer you might want to use.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;JacksonFactory &lt;/strong&gt;- Fastest. Based on popular &lt;a href="http://jackson.codehaus.org/"&gt;Jackson library&lt;/a&gt; .&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GsonFactory &lt;/strong&gt;– Fast. Based on &lt;a href="http://code.google.com/p/google-gson/"&gt;Google GSON library&lt;/a&gt; .&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AndroidJsonFactory &lt;/strong&gt;– Same as GSON and &lt;a href="http://developer.android.com/reference/android/util/JsonReader.html"&gt;built into SDK 3.0&lt;/a&gt; .&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Authentication&lt;/h2&gt;
&lt;p&gt;The preferred way to handle authentication and account management in Android is through the usage of the class &lt;a href="http://developer.android.com/reference/android/accounts/AccountManager.html"&gt;AccountManager&lt;/a&gt; . The AccountManager provides a centralized registry for the user’s online accounts.&lt;/p&gt;
&lt;p&gt;The Google APIs provide a more specific way to handle Google accounts through the &lt;a href="http://javadoc.google-api-java-client.googlecode.com/hg/1.4.1-beta/com/google/api/client/googleapis/extensions/android2/auth/GoogleAccountManager.html"&gt;GoogleAccountManager&lt;/a&gt; class.&lt;/p&gt;
&lt;h3&gt;OAuth&lt;/h3&gt;
&lt;p&gt;Although not in its final draft yet, OAuth 2.0. is recommended for usage because of the benefits it brings in comparison to its previous version.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Supported by (almost) all Google APIs.&lt;/li&gt;
&lt;li&gt;Finer grained scope of access.&lt;/li&gt;
&lt;li&gt;Example for Google Buzz:
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.googleapis.com/auth/buzz"&gt;https://www.googleapis.com/auth/buzz&lt;/a&gt;&lt;/strong&gt; for read/write access to Buzz data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.googleapis.com/auth/buzz.readonly"&gt;https://www.googleapis.com/auth/buzz.readonly&lt;/a&gt;&lt;/strong&gt; for read access to Buzz data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.googleapis.com/auth/photos"&gt;https://www.googleapis.com/auth/photos&lt;/a&gt;&lt;/strong&gt; for read access to Buzz photos.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OAuth tokens are temporary and expire in 1 hour. So it’s important that you check for 401 response errors when making requests and going through the authentication process whenever necessary. Here’s an example taken from a &lt;a href="http://www.google.com/events/io/2011/sessions/best-practices-for-accessing-google-apis-on-android.html"&gt;Google IO 2011 presentation&lt;/a&gt; (PowerPoint file available &lt;a href="http://www.google.com/events/io/2011/static/presofiles/best_practices_for_accessing_google_apis_on_android.ppt"&gt;here&lt;/a&gt; , slide #50):&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
@Override
    protected ActivityFeed doInBackground(Void... params) {
     try {
        // execute HTTP requests
     } catch (HttpResponseException e) {
        if (e.response.statusCode == 401) {
          accountManager.invalidateAuthToken(accessProtectedResource.getAccessToken());
          accessProtectedResource.setAccessToken(null);
          SharedPreferences.Editor editor2 = settings.edit();
          editor2.remove(PREF_AUTH_TOKEN);
          editor2.commit();
          getAuthToken(account);
        }
     }
&lt;/pre&gt;&lt;p&gt;Here you can find a document by Google on &lt;a href="http://code.google.com/apis/accounts/docs/OAuth2.html"&gt;using OAuth 2.0 to access Google APIs&lt;/a&gt; .&lt;/p&gt;
&lt;h2&gt;API Access Key&lt;/h2&gt;
&lt;p&gt;In addition to handling accounts you’ll also need an access key provided by Google to access Google users’ contents through APIs. Here’s an example with a dummy key:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
buzz = new Buzz(new NetHttpTransport(), accessProtectedResource, new AndroidJsonFactory());
buzz.accessKey = "ABCdef123_9q";
&lt;/pre&gt;&lt;p&gt;You can get one of these access keys through the &lt;a href="https://code.google.com/apis/console"&gt;Google APIs Console&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Here you can find instructions on &lt;a href="http://code.google.com/apis/console-help/#generatingdevkeys"&gt;how to create an access key&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Read &lt;a href="http://code.google.com/apis/console-help/#WhatIsKey"&gt;more about access keys here&lt;/a&gt; .&lt;/p&gt;
&lt;h2&gt;Google Buzz API&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://code.google.com/apis/explorer"&gt;Google APIs Explorer&lt;/a&gt; is a super useful tool to test the JSON returned by each call. Although you don’t need to use the JSON directly you can use the explorer to figure out the names of the fields and which field returns what.&lt;/p&gt;
&lt;p&gt;There’s a Google IO presentation, &lt;a href="http://www.google.com/events/io/2011/sessions/best-practices-for-accessing-google-apis-on-android.html"&gt;Best Practices for Accessing Google APIs on Android&lt;/a&gt; , that gives you some nice pointers about the use of Google APIs and Yaniv Inbar, the presenter, uses code examples of how to fetch Google Buzz data. You can find the &lt;a href="http://code.google.com/p/google-api-java-client/source/browse/?repo=samples#hg%2Fbuzz-v1-json-oauth2-android-sample"&gt;full working code of the example here&lt;/a&gt; (buzz-v1-json-oauth2-android-sample). This code was actually our starting point for our own app.&lt;/p&gt;
&lt;h3&gt;Limitations&lt;/h3&gt;
&lt;p&gt;The Google Buzz API Java Client 1.0.0 beta that we’ve used in our app is not 100% implemented, so you need to fetch some of the JSON attributes in an almost raw format. See here is how I had to fetch the attachment’s links from the buzz object:&lt;/p&gt;
&lt;pre class="brush:java;"&gt;
ArrayList&amp;lt; ArrayMap&amp;lt;String, Object&amp;gt; &amp;gt; o = (ArrayList&amp;lt;ArrayMap&amp;lt;String, Object&amp;gt;&amp;gt;) a.links.unknownFields.get(linkType);
String s = (String) o.get(0).get("href");&lt;/pre&gt;&lt;p&gt;Also, posts in your stream that aren’t public will show up with this message:&lt;/p&gt;
&lt;p&gt;"Private post only viewable at &lt;a href="https://plus.google.com/xxx/posts/xxx&amp;quot;"&gt;https://plus.google.com/xxx/posts/xxx"&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-error-handling-and-reporting"&gt;Error handling and reporting&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=yZZVlI8xOwM:i58LNDE8J0g:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=yZZVlI8xOwM:i58LNDE8J0g:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=yZZVlI8xOwM:i58LNDE8J0g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=yZZVlI8xOwM:i58LNDE8J0g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=yZZVlI8xOwM:i58LNDE8J0g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=yZZVlI8xOwM:i58LNDE8J0g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=yZZVlI8xOwM:i58LNDE8J0g:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=yZZVlI8xOwM:i58LNDE8J0g:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=yZZVlI8xOwM:i58LNDE8J0g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=yZZVlI8xOwM:i58LNDE8J0g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=yZZVlI8xOwM:i58LNDE8J0g:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/yZZVlI8xOwM" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 16 Nov 2011 12:11:15 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">113 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-working-google-buzz-api</feedburner:origLink></item>
<item>
 <title>Android 101: Development environment and project creation</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/1RkCT8F47Pc/android-101-development-environment-and-project-creation</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EOk05UC7bqRLP00JacmElhNEZmE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EOk05UC7bqRLP00JacmElhNEZmE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EOk05UC7bqRLP00JacmElhNEZmE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EOk05UC7bqRLP00JacmElhNEZmE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;blockquote&gt;&lt;p&gt;This article is part of an &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;Android Development Guide&lt;/a&gt;. The guide focuses on several subjects necessary to build a fully functional basic app, talking about several features that were introduced in Honeycomb and are still valid for Ice Cream Sandwich. We use a Google Buzz client called Honeybuzz as an example for each topic. Refer to the &lt;a href="http://broculos.net/en/article/android-101-introduction-android-development-guide"&gt;introduction&lt;/a&gt; for a complete list of all articles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first step you need to do is to install your development environment. We will be using Eclipse, the recommended IDE.&lt;/p&gt;
&lt;h2&gt;Installing and configuring the Android SDK and the development environment&lt;/h2&gt;
&lt;p&gt;Here's what you need to get started:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/downloads/"&gt;Download and install Eclipse&lt;/a&gt; (3.5 or greater): I used the "Eclipse IDE for Java Developers" edition. Currently running the Helios release (3.6).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html"&gt;Download and install JDK&lt;/a&gt; (5 or above): JRE is not enough. You must install the JDK (I'm using version 6).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;Download and install the Android SDK&lt;/a&gt; .&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/sdk/eclipse-adt.html#installing"&gt;Download and install the Android Development Tools&lt;/a&gt; (ADT) plugin for Eclipse: follow the instructions provided in the link.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/sdk/installing.html#AddingComponents"&gt;Add platforms and components&lt;/a&gt; using the Android SDK and the AVD manager: be sure to add the platform for Android 3+, SDK tools and Google APIs.&lt;/li&gt;
&lt;li&gt;For debugging in a physical device (phone, tablet, etc.) you will need to&lt;a href="http://developer.android.com/sdk/oem-usb.html"&gt; &lt;/a&gt; &lt;a href="http://developer.android.com/sdk/oem-usb.html"&gt;install a USB driver&lt;/a&gt; . The drivers sometimes come with the installation software for your device, but in many cases you will need to download them from the OEM site.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I also recommend that you use a source control system and the necessary plugins for Eclipse, although that's outside the scope of this article. You can browse the Eclipse Marketplace from within Eclipse (through the Help menu) for a lot of different plugins.&lt;/p&gt;
&lt;h2&gt;Creating your first Android project&lt;/h2&gt;
&lt;p&gt;Creating your first Android project is easy.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Go to &lt;strong&gt;File&lt;/strong&gt; &amp;gt; &lt;strong&gt;New&lt;/strong&gt; &amp;gt; &lt;strong&gt;Project...&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Android Project&lt;/strong&gt; from &lt;strong&gt;Android&lt;/strong&gt; .
&lt;ul&gt;&lt;li&gt;&lt;img src="http://broculos.net/sites/default/files/content/create_android_project.png" style="width: 200px; height: 233px; " /&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Specify the project details:
&lt;ul&gt;&lt;li&gt;&lt;em&gt;Project name&lt;/em&gt;: Honeybuzz in this case.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Build target&lt;/em&gt;: we will be targeting Android 3.0 for this application.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Application name&lt;/em&gt;: the name of your application (usually it will be similar or the same as the project name, but not necessarily).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Package name&lt;/em&gt;: this is a unique name that identifies your application. You should be careful in choosing this name to avoid conflicts with other applications. It's common to write the package name in the form of &lt;strong&gt;com.domain.application&lt;/strong&gt; . In this case we chose &lt;strong&gt;com.quasibit.Honeybuzz&lt;/strong&gt; (because we own the quasibit.com domain).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Create activity&lt;/em&gt;: this should be checked for most applications (an &lt;strong&gt;Activity&lt;/strong&gt; is basically a screen in a Android application) and you should choose a descriptive name. For example, the main &lt;strong&gt;Activity&lt;/strong&gt; in our application is called &lt;strong&gt;HoneybuzzListActivity&lt;/strong&gt; (because it shows a listing of the most recent buzzes).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Min SDK version&lt;/em&gt;: minimum compatible version. For Honeycomb that is 11.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a name="libraries" id="libraries"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Adding external libraries&lt;/h3&gt;
&lt;p&gt;After creating the project we will add the libraries that we need. There are different ways in which you can manage your dependencies. A popular way is by using Maven. Using Maven has a few advantages such as automatically download Java libraries, but it also has some drawbacks: it is more complex to get started and in the case of Android it is not possible to start a debugging session on your device from within Eclipse, because the libraries will not be included in your APK (Android Application Package) in this case.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;p&gt;We will add the libraries manually:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Download all the necessary libraries:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/google-api-java-client/"&gt;Google APIs Client Library for Java&lt;/a&gt; : I used version 1.4.1-beta. You can download the latest version&lt;a href="http://code.google.com/p/google-api-java-client/wiki/Setup#Download_the_Zipped_Jars"&gt; &lt;/a&gt; &lt;a href="http://code.google.com/p/google-api-java-client/wiki/Setup#Download_the_Zipped_Jars"&gt;here&lt;/a&gt; .&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/google-api-java-client/wiki/APIs#Buzz_API"&gt;Buzz API&lt;/a&gt; : using version 1-1.0.0-beta for this project. Also download the source and the JavaDoc.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Make a new folder libraries in your project.&lt;/li&gt;
&lt;li&gt;Add the libraries, sources and available JavaDoc to this folder. Make sure they are copied, not linked. I do it this way so I can store everything in the source control. I added these libraries:
&lt;ul&gt;&lt;li&gt;google-api-client-1.4.1-beta&lt;/li&gt;
&lt;li&gt;google-api-client-extensions-android2-1.4.1-beta&lt;/li&gt;
&lt;li&gt;google-api-client-extensions-android3-1.4.1-beta&lt;/li&gt;
&lt;li&gt;google-api-client-googleapis-1.4.1-beta&lt;/li&gt;
&lt;li&gt;google-api-client-googleapis-extensions-android2-1.4.1-beta&lt;/li&gt;
&lt;li&gt;google-api-services-buzz-v1-1.0.0-beta&lt;/li&gt;
&lt;li&gt;And these dependencies:
&lt;ul&gt;&lt;li&gt;gson-1.6&lt;/li&gt;
&lt;li&gt;guava-r09&lt;/li&gt;
&lt;li&gt;jackson-core-asl-1.6.7&lt;/li&gt;
&lt;li&gt;jsr305-1.3.9&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;In later articles we will also add libraries for analytics, ads and error reporting.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Specify the libraries in the project properties.
&lt;ul&gt;&lt;li&gt;Right click the project and open its properties.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Java Build Path&lt;/strong&gt; and open the &lt;strong&gt;Libraries&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Add all the libraries using the &lt;strong&gt;Add JARs...&lt;/strong&gt; option:
&lt;ul&gt;&lt;li&gt;Expand your project and the libraries folder and select the JAR.&lt;/li&gt;
&lt;li&gt;Expand the JAR's details and specify the sources and JavaDoc location when available.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;You should end up with something similar to this:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://broculos.net/sites/default/files/content/project_libraries.png"&gt;&lt;img src="http://broculos.net/sites/default/files/content/project_libraries.png" style="width: 200px; height: 120px; " /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The&lt;a href="http://code.google.com/eclipse/"&gt; &lt;/a&gt; &lt;a href="http://code.google.com/eclipse/"&gt;Google Plugin for Eclipse&lt;/a&gt; also helps adding Google APIs to your project, but we haven't used it in this case.&lt;/p&gt;
&lt;h3&gt;Setting up ProGuard&lt;/h3&gt;
&lt;p&gt;We will do an extra configuration step to help reduce the application size. &lt;a href="http://proguard.sourceforge.net/"&gt;ProGuard&lt;/a&gt; will shrink and optimize your Java files by stripping out unused code and performing code optimizations.&lt;/p&gt;
&lt;p&gt;How to configure ProGuard for your Android application:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Edit the &lt;strong&gt;default.properties&lt;/strong&gt; file and add the line:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="brush:plain;"&gt;
proguard.config=proguard.cfg&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Edit your &lt;strong&gt;proguard.cfg&lt;/strong&gt; file and add the following lines:&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="brush:plain;"&gt;
# Needed by google-api-client to keep generic types and @Key annotations accessed via reflection

-keepclassmembers class * {
  @com.google.api.client.util.Key &amp;lt;fields&amp;gt;;
}

-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault

# Needed by Guava

-dontwarn sun.misc.Unsafe&lt;/pre&gt;&lt;p&gt;This is the basis for the initial configuration of your project. Next we will do a very brief introduction to Android development.&lt;/p&gt;
&lt;h2&gt;Android Development Overview&lt;/h2&gt;
&lt;p&gt;The best resource for Android development is the &lt;a href="http://developer.android.com/index.html"&gt;Android Developers&lt;/a&gt; site: it has development guides, references and resources.&lt;/p&gt;
&lt;p&gt;In this guide we will be talking about several different topics, but we won't go deep into Android fundamentals, because the Android Developers site already does a good job in that. For starters I would recommend reading &lt;a href="http://developer.android.com/guide/basics/what-is-android.html"&gt;What is Android?&lt;/a&gt; and &lt;a href="http://developer.android.com/guide/topics/fundamentals.html"&gt;Application Fundamentals&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is a very brief overview of an Android application:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Most applications have &lt;strong&gt;Activities&lt;/strong&gt;. An &lt;strong&gt;Activity&lt;/strong&gt; is basically a screen in your application.&lt;/li&gt;
&lt;li&gt;Some applications use &lt;strong&gt;Services&lt;/strong&gt; that run in the background. A &lt;strong&gt;Service&lt;/strong&gt; doesn't have an interface and is usually used to perform long-running processes, such as updating the data for an application.&lt;/li&gt;
&lt;li&gt;When you want to start an &lt;strong&gt;Activity&lt;/strong&gt; or a &lt;strong&gt;Service&lt;/strong&gt; you declare an &lt;strong&gt;Intent&lt;/strong&gt;. An &lt;strong&gt;Intent&lt;/strong&gt; doesn't have to be exclusive to your application. One example of an &lt;strong&gt;Intent&lt;/strong&gt; is to open a web page in the user's browser.&lt;/li&gt;
&lt;li&gt;Your application has a manifest. In the manifest you specify all your &lt;strong&gt;Activities&lt;/strong&gt;, &lt;strong&gt;Services&lt;/strong&gt;, your widgets, the required permissions and much more. It is at the root of your project and is called &lt;strong&gt;AndroidManifest.xml&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You define the interface for your &lt;strong&gt;Activities&lt;/strong&gt; using layout files. Layouts usually contain one or more &lt;strong&gt;Views&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Resources are stored in the &lt;strong&gt;res&lt;/strong&gt; folder. All your project images, layout files, strings, preferences, configuration values and more are stored here.&lt;/li&gt;
&lt;li&gt;An Android application is delivered using an APK (Android Application Package): it is a compiled package with all the resources of your application. This is what gets installed on Android devices.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Before continuing I recommend that you read at least the first 4 &lt;a href="http://developer.android.com/resources/browser.html?tag=tutorial"&gt;tutorials found on the Android Developers site&lt;/a&gt;. A basic knowledge of Activities, layouts and resources will be required for the reminder of the development guide.&lt;/p&gt;
&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-working-google-buzz-api"&gt;Working with Google Buzz API&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=1RkCT8F47Pc:UVNqVIWNtJU:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=1RkCT8F47Pc:UVNqVIWNtJU:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=1RkCT8F47Pc:UVNqVIWNtJU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=1RkCT8F47Pc:UVNqVIWNtJU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=1RkCT8F47Pc:UVNqVIWNtJU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=1RkCT8F47Pc:UVNqVIWNtJU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=1RkCT8F47Pc:UVNqVIWNtJU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=1RkCT8F47Pc:UVNqVIWNtJU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=1RkCT8F47Pc:UVNqVIWNtJU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=1RkCT8F47Pc:UVNqVIWNtJU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=1RkCT8F47Pc:UVNqVIWNtJU:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/1RkCT8F47Pc" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 14 Nov 2011 17:08:30 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">115 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-development-environment-and-project-creation</feedburner:origLink></item>
<item>
 <title>Android 101: Introduction to Android Development Guide</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/qBd-IwR6yos/android-101-introduction-android-development-guide</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cvt2eHCtCJdrylUx4nuN5aQLeno/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cvt2eHCtCJdrylUx4nuN5aQLeno/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cvt2eHCtCJdrylUx4nuN5aQLeno/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cvt2eHCtCJdrylUx4nuN5aQLeno/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;This is the first article in what will be a series of tutorials about Android development. This is meant as an introductory class to Android: it's for people who are already programmers but new to Android.&lt;/p&gt;
&lt;p&gt;We will be covering the basics and focusing on features introduced in Honeycomb, going through the most common steps to build a fully functional Android application. Although we focus on Honeycomb, everything is still valid for Ice Cream Sandwich.&lt;/p&gt;
&lt;p&gt;We got the idea for this guide when we were building a Google Buzz client called Honeybuzz. When Google+ was announced we decided to abandon the app, but at least make use of the knowledge we learned to help other people. We were still going to publish the app (as a demonstration), but when &lt;a href="http://googleblog.blogspot.com/2011/10/fall-sweep.html"&gt;the shutdown of Google Buzz was announced&lt;/a&gt; , we realized it would be useless after a short while.&lt;/p&gt;
&lt;p&gt;We will use the app as a reference point, serving as an example of how each topic might be applied in a real app. Following are a couple of screenshots of Honeybuzz.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_dark.png"&gt;&lt;img src="http://broculos.net/sites/default/files/resize/content/honeybuzz_dark-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_light.png"&gt;&lt;img src="http://broculos.net/sites/default/files/resize/content/honeybuzz_light-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_portrait_details.png"&gt;&lt;img src="http://broculos.net/sites/default/files/resize/content/honeybuzz_portrait_details-78x125.png" style="width: 78px; height: 125px; " width="78" height="125" /&gt;&lt;/a&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_portrait_listing.png"&gt;&lt;img src="http://broculos.net/sites/default/files/resize/content/honeybuzz_portrait_listing-78x125.png" style="width: 78px; height: 125px; " width="78" height="125" /&gt;&lt;/a&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_widget.png"&gt;&lt;img src="http://broculos.net/sites/default/files/resize/content/honeybuzz_widget-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;a href="http://broculos.net/sites/default/files/content/honeybuzz_prefences.png"&gt;&lt;img src="http://broculos.net/sites/default/files/resize/content/honeybuzz_prefences-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These are the chapters of this guide:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-development-environment-and-project-creation"&gt;Development environment and project creation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-working-google-buzz-api"&gt;Working with Google Buzz API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-error-handling-and-reporting"&gt;Error handling and reporting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-using-google-analytics-your-android-application"&gt;Using Google Analytics in your Android application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-storing-and-retrieving-user-preferences"&gt;Storing and retrieving user preferences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-how-create-options-menu-action-bar"&gt;How to create an options menu for the Action Bar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-styles-and-themes"&gt;Styles and Themes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-use-fragments-handle-different-screen-orientations"&gt;Use Fragments to handle different screen orientations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-services-asynctasks-and-notifications"&gt;Services, AsyncTasks and Notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-how-monetize-your-android-application"&gt;How to monetize your Android application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-how-create-stackview-widget"&gt;How to create a StackView widget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.broculos.net/en/article/android-101-publish-android-market"&gt;Publish to the Android Market&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;An hyperlink will be added to each chapter after it is published.&lt;/p&gt;
&lt;p&gt;We hope you enjoy this series of tutorials and we look forward to hearing your comments and suggestions.&lt;/p&gt;
&lt;h3&gt;Next: &lt;a href="http://www.broculos.net/en/article/android-101-development-environment-and-project-creation"&gt;Development environment and project creation&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qBd-IwR6yos:AtuTL-NiUY4:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=qBd-IwR6yos:AtuTL-NiUY4:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qBd-IwR6yos:AtuTL-NiUY4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qBd-IwR6yos:AtuTL-NiUY4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qBd-IwR6yos:AtuTL-NiUY4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=qBd-IwR6yos:AtuTL-NiUY4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qBd-IwR6yos:AtuTL-NiUY4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=qBd-IwR6yos:AtuTL-NiUY4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qBd-IwR6yos:AtuTL-NiUY4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=qBd-IwR6yos:AtuTL-NiUY4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=qBd-IwR6yos:AtuTL-NiUY4:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/qBd-IwR6yos" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 14 Nov 2011 17:08:00 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">111 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/android-101-introduction-android-development-guide</feedburner:origLink></item>
<item>
 <title>Broculos.net now has a Google+ Page</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/iTIqZOVgD3A/broculosnet-now-has-google-page</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qHtglWZbRbsmDPJb_0a3X81Te_c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qHtglWZbRbsmDPJb_0a3X81Te_c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qHtglWZbRbsmDPJb_0a3X81Te_c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qHtglWZbRbsmDPJb_0a3X81Te_c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;You can now &lt;a href="https://plus.google.com/104045844362815664699/?prsrc=3"&gt;follow us on Google+&lt;/a&gt; too! Google &lt;a href="http://googleblog.blogspot.com/2011/11/google-pages-connect-with-all-things.html"&gt;recently announced Google+ Pages&lt;/a&gt;, a way for brands and businesses to connect with customers and fans.&lt;/p&gt;
&lt;p&gt;Be sure to &lt;a href="https://plus.google.com/104045844362815664699/?prsrc=3"&gt;add us to your Google+ circles&lt;/a&gt; and keep up to date with our latest news and articles.&lt;/p&gt;
&lt;h2&gt;How to create a Google+ Page&lt;/h2&gt;
&lt;p&gt;Creating a Google+ Page is pretty straitghtforward. Go to the &lt;a href="https://plus.google.com/pages/create"&gt;Create a Google+ Page&lt;/a&gt;, choose the type of page and fill in all the details.&lt;/p&gt;
&lt;p&gt;If you want to be able to apply for Direct connect, which is a way of users to find your page in Google by just typing + followed by the name of the page, you need to add this HTML code to the &lt;strong&gt;&amp;lt;head&amp;gt;&lt;/strong&gt; of your site:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;link href="https://plus.google.com/PAGE_ID/" rel="publisher" /&amp;gt;&lt;/pre&gt;&lt;p&gt;Make sure to fill all the information in your Google+ Page, including the URL to your website and all the contact information.&lt;/p&gt;
&lt;p&gt;A &lt;a href="https://developers.google.com/+/plugins/badge/"&gt;Google+ Badge&lt;/a&gt;, which is currently only available as a preview, let's a user add a page to his circles directly from your website. You can use the &lt;a href="https://developers.google.com/+/plugins/badge/config"&gt;Google+ Badge configuration tool&lt;/a&gt; to generate the necessary code. Use a static badge in the meantime, while the standard badge is in preview, to be sure that all your visitors can see a link to your Google+ Page. You can see our own badge on the right sidebar.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=iTIqZOVgD3A:glEu6ag0jwo:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=iTIqZOVgD3A:glEu6ag0jwo:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=iTIqZOVgD3A:glEu6ag0jwo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=iTIqZOVgD3A:glEu6ag0jwo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=iTIqZOVgD3A:glEu6ag0jwo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=iTIqZOVgD3A:glEu6ag0jwo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=iTIqZOVgD3A:glEu6ag0jwo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=iTIqZOVgD3A:glEu6ag0jwo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=iTIqZOVgD3A:glEu6ag0jwo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=iTIqZOVgD3A:glEu6ag0jwo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=iTIqZOVgD3A:glEu6ag0jwo:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/iTIqZOVgD3A" height="1" width="1"/&gt;</description>
 <pubDate>Sat, 12 Nov 2011 18:27:01 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">134 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/news/broculosnet-now-has-google-page</feedburner:origLink></item>
<item>
 <title>SharePoint 2010 Branding: 100% horizontal top navigation </title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/rvoVgeDtmlE/sharepoint-2010-branding-100-horizontal-top-navigation</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/F8h_as3v_fJp9WTcPUYmvw6a58Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F8h_as3v_fJp9WTcPUYmvw6a58Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/F8h_as3v_fJp9WTcPUYmvw6a58Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F8h_as3v_fJp9WTcPUYmvw6a58Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;In SharePoint 2007 the top navigation control was rendered as an entanglement of never ending tables. You couldn't (and probably didn't even want to try) to change it's design beyond colors and spacing. Now in SharePoint 2010 the top navigation is rendered in a very elegant manner with nested lists. This enables us front-end developers to create a lot of different layouts. I'll give you a few examples of how you can render the top navigation in an horizontal fashion. I'll give you the minimal amount of code necessary so that it can easily be reused.&lt;/p&gt;
&lt;p&gt;Our starting point:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-htopnav-1.png" style="width: 407px; height: 115px; " /&gt;&lt;/p&gt;
&lt;p&gt;I'm working with only a two-level navigation, if you need more a level you'll need to work on top of this implementation to accommodate your needs.&lt;/p&gt;
&lt;h3&gt;Show 2nd level only on hover&lt;/h3&gt;
&lt;p&gt;Here I want the default behavior, except for the 2nd level rendering horizontally. One thing relevant here is that I've created some space bellow the 1st level to accommodate the 2nd level, so that it doesn't hover the rest of the content, but it's a part of the flow of the design.&lt;/p&gt;
&lt;p&gt;Normal state:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-htopnav-3.png" style="width: 295px; height: 59px; " /&gt;&lt;/p&gt;
&lt;p&gt;Hovering 'Work' tab:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-htopnav-2.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: baseline; cursor: default; width: 441px; height: 71px; " /&gt;&lt;/p&gt;
&lt;p&gt;This is the code, I think is very self explanatory. Otherwise I added a few comment on key declarations.&lt;/p&gt;
&lt;pre class="brush:css;"&gt;
.s4-toplinks {
	padding-bottom: 23px; /* create space to fit the 2nd level nav */
	position: relative;
}

.s4-toplinks .s4-tn li {
	position: static !important; /* 2nd level will be positioned relative to .s4-toplinks container */
}

/* hover 2nd level */
.s4-tn li.hover-off ul.dynamic,
.s4-tn li.hover ul.dynamic {
	left: 0 !important;
	bottom: 0 !important;
	top: auto !important; /* reset */
}

.s4-toplinks li  &amp;gt; ul.dynamic li.dynamic {
    float: left;
}&lt;/pre&gt;&lt;h3&gt;Horizontal only for 2nd level selected tab (always visible)&lt;/h3&gt;
&lt;p&gt;This is a very useful solution to the user as you can see the 2nd level of the site you're currently on. Other menus (for unselected tabs) will still be vertical. See next example on how to do this with all menus being horizontal (we'll be using JavaScript). &lt;/p&gt;
&lt;p&gt;Normal state (when inside "Work" site):&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-htopnav-4.png" style="width: 523px; height: 76px; " /&gt;&lt;/p&gt;
&lt;p&gt;Hovering another tab:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-htopnav-5.png" style="width: 539px; height: 109px; " /&gt;&lt;/p&gt;
&lt;pre class="brush:css;"&gt;
.s4-toplinks {
	padding-bottom: 23px; /* create space to fit the 2nd level nav */
	position: relative;
}

.s4-toplinks .s4-tn li.selected {
	position: static !important; /* 2nd level will be positioned relative to .s4-toplinks container */
}

/* hover 2nd level */
.s4-tn li.selected ul.dynamic,
.s4-tn li.selected.hover-off ul.dynamic,
.s4-tn li.selected.hover ul.dynamic {
	left: 0 !important;
	bottom: 0 !important;
	top: auto !important; /* reset */
}

.s4-toplinks li.selected  &amp;gt; ul.dynamic li.dynamic {
    float: left;
}&lt;/pre&gt;&lt;p&gt;&lt;span style="color: rgb(34, 34, 34); font-family: arial, sans-serif; font-size: 13px; line-height: normal; background-color: rgba(255, 255, 255, 0.917969); "&gt;&lt;br /&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Show 2nd level for selected tab (always visible) and on hover&lt;/h3&gt;
&lt;p&gt;Here I want to have the 2nd level navigation for the selected site to be always visible. When I hover other tabs I want the current 2nd level navigation to be hidden and the hovered tab 2nd level to be shown.&lt;/p&gt;
&lt;p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: baseline; "&gt;Normal state (when inside "Work" site):&lt;/p&gt;
&lt;p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: baseline; "&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-htopnav-4.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: baseline; cursor: default; width: 523px; height: 76px; " /&gt;&lt;/p&gt;
&lt;p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: baseline; "&gt;Hovering "News" tab:&lt;/p&gt;
&lt;p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: baseline; "&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-htopnav-6.png" style="width: 534px; height: 68px; " /&gt;&lt;/p&gt;
&lt;p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: baseline; "&gt;This is a bare essentials implementation. You might want to have some visual cues to what tab is selected.&lt;/p&gt;
&lt;p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: baseline; "&gt;The CSS:&lt;/p&gt;
&lt;pre class="brush:css;"&gt;
.s4-toplinks {
	padding-bottom: 23px; /* create space to fit the 2nd level nav */
	position: relative;
}

.s4-toplinks .s4-tn li {
	position: static !important; /* 2nd level will be positioned relative to .s4-toplinks container */
}

/* hover 2nd level */
.s4-tn li.selected ul.dynamic,
.s4-tn li.hover-off ul.dynamic,
.s4-tn li.hover ul.dynamic {
	left: 0 !important;
	bottom: 0 !important;
	top: auto !important; /* reset */
}

.s4-toplinks li &amp;gt; ul.dynamic li.dynamic {
    float: left;
}&lt;/pre&gt;&lt;p&gt;The JavaScript:&lt;/p&gt;
&lt;pre class="brush:jscript;"&gt;
jQuery(document).ready(function () {
	handleHorizontalNav();
});

function handleHorizontalNav() {
	jQuery(".s4-toplinks li.dynamic-children:not(.selected) &amp;gt; a, .s4-toplinks li.dynamic-children:not(.selected) &amp;gt; ul.dynamic").hover(
	function(){		
		jQuery(".s4-tn li.selected &amp;gt; ul.dynamic").css("display", "none");
	},		
	function(){
		jQuery(".s4-tn li.selected ul.dynamic").css("display", "block");
	});
	
	jQuery(".s4-toplinks li.selected a").unbind('hover');
}&lt;/pre&gt;&lt;h3&gt;Set selected element in 2nd level&lt;/h3&gt;
&lt;p&gt;A problem with having the 2nd level always visible is that you wont have a nice CSS selector for the current selected item in the 2nd level. We can handle this issue using JavaScript.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-htopnav-7.png" style="width: 517px; height: 64px; " /&gt;&lt;/p&gt;
&lt;pre class="brush:jscript;"&gt;
String.prototype.startsWith = function(str){
    return (this.indexOf(str) === 0);
}

function setActiveItemInTopNavSecondLevel() {
    var cururl = window.location.pathname;
    var menu = jQuery(".s4-toplinks li.selected ul.dynamic");

    menu.children("li").each(function (i, e) {
        var item = jQuery(this).find("a.menu-item");
        var url = item.attr("href");
		
        if (cururl.startsWith(url)) {
            item.addClass("selected");
        }
    });
}&lt;/pre&gt;&lt;h3&gt;Center 2nd level navigation relative to parent tab&lt;/h3&gt;
&lt;p&gt;Another nice visual cue for the 2nd level is to have it centered relative to it's parent tab, instead of everything being left aligned. Let's see how to do this with  JavaScript.&lt;/p&gt;
&lt;p&gt;I've resized the elements a bit so that you can better see the effect: &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-htopnav-8.png" style="width: 561px; height: 69px; " /&gt;&lt;/p&gt;
&lt;pre class="brush:jscript;"&gt;
function centerTopNavSecondLevel() {
    jQuery(".s4-toplinks li.dynamic-children").each(function (i, e) {
		var menu = jQuery(this).children("ul.dynamic");
		
		if (jQuery(this).offset() != null) {
            left = (jQuery(this).offset().left - (menu.width() / 2)) + (jQuery(this).width() / 2);
        }
		
		// check if the menu doesnt overflow to the left
        if (left &amp;lt; 0) {
            left = 0; 
        }
		
        menu.children("li").first().css("margin-left", left + "px");
    });
}&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=rvoVgeDtmlE:nxKUrZ5bT7g:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=rvoVgeDtmlE:nxKUrZ5bT7g:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=rvoVgeDtmlE:nxKUrZ5bT7g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=rvoVgeDtmlE:nxKUrZ5bT7g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=rvoVgeDtmlE:nxKUrZ5bT7g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=rvoVgeDtmlE:nxKUrZ5bT7g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=rvoVgeDtmlE:nxKUrZ5bT7g:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=rvoVgeDtmlE:nxKUrZ5bT7g:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=rvoVgeDtmlE:nxKUrZ5bT7g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=rvoVgeDtmlE:nxKUrZ5bT7g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=rvoVgeDtmlE:nxKUrZ5bT7g:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/rvoVgeDtmlE" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 07 Nov 2011 12:00:19 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">88 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-2010-branding-100-horizontal-top-navigation</feedburner:origLink></item>
<item>
 <title>SharePoint 2010 Branding: The application.master master page </title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/7SjGpPC4NXQ/sharepoint-2010-branding-applicationmaster-master-page</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zfTIO1F5JZl5WihCom3sKYof-XE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zfTIO1F5JZl5WihCom3sKYof-XE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zfTIO1F5JZl5WihCom3sKYof-XE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zfTIO1F5JZl5WihCom3sKYof-XE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;In SharePoint 2010 a small number of pages still uses the application.master (for example: /_layouts/listkeywords.aspx). All the pages stored in the layouts folder in the 14 hive use the application.master. This sucks if you want to brand these pages.&lt;/p&gt;
&lt;p&gt;Searching a bit I found this &lt;a href="http://support.microsoft.com/kb/944105"&gt;Microsoft article&lt;/a&gt; that gives a couple of methods (and even recommends one) for changing the application.master file in the file system (which unsupported operation for SharePoint).  If Microsoft explains how to do it and even recommends it, I'm not looking back. I'm changing the application.master in the file system.&lt;/p&gt;
&lt;p&gt;I'm also going to make this process automatic by deploying both the edited and backed up application master page from my Visual Studio 2010 solution. So in case of disaster the original version of the file is backed up on the server. Here's how it looks:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-appmaster.PNG" style="width: 225px; height: 196px; " /&gt;&lt;/p&gt;
&lt;p&gt;You might also need to deploy the application.master (if your portal supports UI version 3). And, as always respect the file, don't just copy stuff indiscriminately from other master pages. Use the controls that are already there. Just change the layout the same way you would for the standard master page.&lt;/p&gt;
&lt;p&gt;You can also do this in a much more appropriate and supported fashion, using an HTTP Module. You can find extensive information about it if you do a bit of internet search.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7SjGpPC4NXQ:DjhKmMSSJyQ:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7SjGpPC4NXQ:DjhKmMSSJyQ:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7SjGpPC4NXQ:DjhKmMSSJyQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7SjGpPC4NXQ:DjhKmMSSJyQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7SjGpPC4NXQ:DjhKmMSSJyQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7SjGpPC4NXQ:DjhKmMSSJyQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7SjGpPC4NXQ:DjhKmMSSJyQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7SjGpPC4NXQ:DjhKmMSSJyQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7SjGpPC4NXQ:DjhKmMSSJyQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7SjGpPC4NXQ:DjhKmMSSJyQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7SjGpPC4NXQ:DjhKmMSSJyQ:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/7SjGpPC4NXQ" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 31 Oct 2011 10:55:57 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">89 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-2010-branding-applicationmaster-master-page</feedburner:origLink></item>
<item>
 <title>SharePoint 2010 Branding: Responsive HTML5 masterpage for SharePoint 2010</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/7fpywm078C8/sharepoint-2010-branding-responsive-html5-masterpage-sharepoint-2010</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tCIFvgV8TiEaRnwCjeyLgjouiSo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tCIFvgV8TiEaRnwCjeyLgjouiSo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tCIFvgV8TiEaRnwCjeyLgjouiSo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tCIFvgV8TiEaRnwCjeyLgjouiSo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;&lt;a href="http://kyleschaeffer.com"&gt;Kyle Schaeffer&lt;/a&gt; created a great looking &lt;a href="http://kyleschaeffer.com/sharepoint/v5-responsive-html5-master-page/"&gt;HTML5 enabled masterpage for Sharepoint 2010&lt;/a&gt;. I was testing it around and since the deployment instructions where all manual uploads to SharePoint lists and whatnot I decided to automate this process. I created a Visual Studio solution with all the files and a feature that will activate the whole thing.&lt;/p&gt;
&lt;p&gt;So the solution includes all the unaltered files provided by &lt;a href="http://kyleschaeffer.com" style="border-style: initial; border-color: initial; "&gt;Kyle Schaeffer&lt;/a&gt;, under the  &lt;a href="http://creativecommons.org/licenses/by/3.0/"&gt;Creative Commons Attribution&lt;/a&gt; license 3.0. The only thing i did was create the solution and the code to activate the master page in the feature event receiver.&lt;/p&gt;
&lt;p&gt;Be sure to read the whole article &lt;a href="http://kyleschaeffer.com/sharepoint/v5-responsive-html5-master-page/" style="border-style: initial; border-color: initial; "&gt;HTML5 enabled masterpage for Sharepoint 2010&lt;/a&gt;. There are important limitations to this solution.&lt;/p&gt;
&lt;p&gt;This is how the solution looks like:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2020-v5-solutionfiles.PNG" style="width: 279px; height: 342px; " /&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The most important method in the event receiver, to change the active site and system master page.&lt;/p&gt;
&lt;pre class="brush:csharp;"&gt;
private void UpdateMasterPage(SPWeb web, String newMasterFileName) {
            try {                
                bool webAllowUnsafeUpdates = web.AllowUnsafeUpdates;

                web.AllowUnsafeUpdates = true;

                web.CustomMasterUrl = web.CustomMasterUrl.Replace(Path.GetFileName(web.CustomMasterUrl), newMasterFileName); // Site Masterpage
                web.MasterUrl = web.MasterUrl.Replace(Path.GetFileName(web.MasterUrl), newMasterFileName); // System Masterpage
                web.Update();

                web.AllowUnsafeUpdates = webAllowUnsafeUpdates;               
            }
            catch (Exception e) {
            }
}&lt;/pre&gt;&lt;p&gt;The feature is activated at site collection level.&lt;/p&gt;
&lt;p&gt;You can download the wsp file and the Visual Studio solution I've created under the same license (&lt;a href="http://creativecommons.org/licenses/by/3.0/" style="border-style: initial; border-color: initial; "&gt;Creative Commons Attribution&lt;/a&gt; license 3.0) as the original files. See this article's attachments at the end.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7fpywm078C8:mEDy-SWhulw:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7fpywm078C8:mEDy-SWhulw:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7fpywm078C8:mEDy-SWhulw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7fpywm078C8:mEDy-SWhulw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7fpywm078C8:mEDy-SWhulw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7fpywm078C8:mEDy-SWhulw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7fpywm078C8:mEDy-SWhulw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7fpywm078C8:mEDy-SWhulw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7fpywm078C8:mEDy-SWhulw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7fpywm078C8:mEDy-SWhulw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7fpywm078C8:mEDy-SWhulw:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/7fpywm078C8" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 26 Oct 2011 07:00:06 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">107 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-2010-branding-responsive-html5-masterpage-sharepoint-2010</feedburner:origLink></item>
<item>
 <title>SharePoint 2010 Branding: Change site actions and welcome menu arrows</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/D9h6YaS4bx0/sharepoint-2010-branding-change-site-actions-and-welcome-menu-arrows</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lPPIvS7hOqxM-4VUPanS2q_U7bI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lPPIvS7hOqxM-4VUPanS2q_U7bI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lPPIvS7hOqxM-4VUPanS2q_U7bI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lPPIvS7hOqxM-4VUPanS2q_U7bI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;Ever wondered how to change the arrow image of the Site Actions menu and the Welcome menu?&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-sa-welc-arrow-1.PNG" style="width: 380px; height: 47px; " /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-sa-welc-arrow-2.PNG" style="width: 148px; height: 24px; " /&gt;&lt;/p&gt;
&lt;p&gt;Here's how you can do it. Hide the image and give the container element a background image. Like so:&lt;/p&gt;
&lt;pre class="brush:css;"&gt;

.ms-viewselector-arrow {
    background: transparent url('/_layouts/images/custom/new-arrow.png') no-repeat scroll 0 0;
    height: 4px; /* height of the image */
    width: 5px; /* width of the image */
}

.ms-viewselector-arrow img {
    display: none;
}&lt;/pre&gt;&lt;p&gt;Not a big change, but certainly a nice tweak to help the branding consistency.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=D9h6YaS4bx0:5ZGp4lHzQ6o:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=D9h6YaS4bx0:5ZGp4lHzQ6o:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=D9h6YaS4bx0:5ZGp4lHzQ6o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=D9h6YaS4bx0:5ZGp4lHzQ6o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=D9h6YaS4bx0:5ZGp4lHzQ6o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=D9h6YaS4bx0:5ZGp4lHzQ6o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=D9h6YaS4bx0:5ZGp4lHzQ6o:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=D9h6YaS4bx0:5ZGp4lHzQ6o:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=D9h6YaS4bx0:5ZGp4lHzQ6o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=D9h6YaS4bx0:5ZGp4lHzQ6o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=D9h6YaS4bx0:5ZGp4lHzQ6o:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/D9h6YaS4bx0" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 24 Oct 2011 14:00:00 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">86 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-2010-branding-change-site-actions-and-welcome-menu-arrows</feedburner:origLink></item>
<item>
 <title>Giveaway: CodeLobster PHP IDE Professional edition</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/ZJnjVlE9TuQ/giveaway-codelobster-php-ide-professional-edition</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tdhtB1Wk2PdqINQ1q9SfHNQ5EO8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tdhtB1Wk2PdqINQ1q9SfHNQ5EO8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tdhtB1Wk2PdqINQ1q9SfHNQ5EO8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tdhtB1Wk2PdqINQ1q9SfHNQ5EO8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;h3&gt;Update&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;The contest has finished and we found our 3 winners. Thank you all for your interest and participation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We have a special treat for all PHP developers out there. We will be offering 3 full Professional licenses for the &lt;a href="http://www.codelobster.com"&gt;CodeLobster&lt;/a&gt; PHP IDE. CodeLobster is a free PHP IDE, but it also has a Professional version with several paid plugins for common CMSs and frameworks.&lt;/p&gt;
&lt;h4&gt;How to participate&lt;/h4&gt;
&lt;p&gt;The contest is simple: just leave a comment in this article and two weeks from now we will randomly select the winners. Make sure to correctly fill your email when submitting your comment, so that we can contact you if you are one of the chosen ones.&lt;/p&gt;
&lt;p&gt;If you are new to our site you can also subscribe to &lt;a href="http://www.broculos.net/en/rss.xml"&gt;our RSS feed&lt;/a&gt; and be up-to-date with future articles and giveaways.&lt;/p&gt;
&lt;p&gt;Accompanying the giveaway is also a full review of the CodeLobster PHP IDE. CodeLobster was generous enough to offer us the licenses for the giveaway and for the testing, but the review remains my sole responsibility and only reflects my independent view.&lt;/p&gt;
&lt;h2&gt;CodeLobster PHP Editor Review&lt;/h2&gt;
&lt;h4&gt;Pros&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;Fast and straightforward editor, with no bloat.&lt;/li&gt;
&lt;li&gt;Nice plugins for Drupal and other CMSs and frameworks (only in Professional version).&lt;/li&gt;
&lt;li&gt;Portable version.&lt;/li&gt;
&lt;li&gt;FTP and source control features.&lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt;Cons&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;Lack of profiles (i.e. different profiles per project - development, test, production, etc.).&lt;/li&gt;
&lt;li&gt;Limited SVN support (for now).&lt;/li&gt;
&lt;li&gt;No code snippets manager/support.&lt;/li&gt;
&lt;li&gt;Only available for Windows.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;CodeLobster PHP Editor&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.codelobster.com/"&gt;CodeLobster&lt;/a&gt; is a PHP IDE for Windows. There is a free version (that you need to &lt;a href="http://www.codelobster.com/scripts/regform.php"&gt;register&lt;/a&gt; for) with the usual support for PHP/JS/HTML/CSS editing and also a &lt;a href="http://www.codelobster.com/order.html"&gt;Professional version&lt;/a&gt; with plugins for common CMSs and frameworks.&lt;/p&gt;
&lt;p&gt;Installation is straightforward. CodeLobster can associate itself with the filesystem for all the types of files it supports, but the thing that got my attention during installation is the ability to install a portable version. It’s a nice addition and it will allow you to move the CodeLobster folder to other machines. If you don’t select it during installation, you can later configure it in the preferences.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_config_portable.png"&gt;&lt;img alt="CodeLobster portable preferences" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_config_portable-200x118.png" style="width: 200px; height: 118px; " width="200" height="118" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After installation you will notice a trial screen. If you want to use the free version you can &lt;a href="http://www.codelobster.com/scripts/regform.php"&gt;request a code&lt;/a&gt; to be sent to your email.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_splashscreen.png"&gt;&lt;img alt="CodeLobster trial screen" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_splashscreen-200x113.png" style="width: 200px; height: 113px; " width="200" height="113" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The first thing that will grab your attention when you start up the editor is the amount of toolbars and windows that are open. It’s nice that it has that many, but I find it unnecessary to have all of them open.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_editor.png"&gt;&lt;img alt="CodeLobster PHP editor" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_editor-200x144.png" style="width: 200px; height: 144px; " width="200" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thankfully, it’s quite easy to customize the UI to your liking, by closing toolbars and windows that you don’t want to see or by moving them around.&lt;/p&gt;
&lt;p&gt;The lack of a startup screen is a welcome non-feature. A lot of IDEs will start with a welcome or latest news screen. I find that unnecessary. I just want to get to the latest project that I was working on, which is exactly what CodeLobster does. Although if you prefer to have some news, at least when you have some plugins installed, you can choose to have a Latest News window at startup, though it’s disabled by default.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;p&gt;CodeLobster is overall simpler than more advanced IDEs such as NetBeans or Eclipse, which have to support a wider range of languages and features. Because it is only targeted for PHP and HTML/JS/CSS editing, it is actually more straightforward to use and it doesn’t have to support unnecessary features.&lt;/p&gt;
&lt;p&gt;The basics are there, so let’s talk about some of its features.&lt;/p&gt;
&lt;h4&gt;Code highlighting and theme support&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_config_theme.png"&gt;&lt;img alt="CodeLobster code highlighting and theme support" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_config_theme-200x148.png" style="width: 200px; height: 148px; " width="200" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CodeLobster supports several themes, if you don’t like the default one. If you have a file already open behind the preferences window, you can preview how a theme will look just by selecting it. There are some dark themes, but you can also design a custom one.&lt;/p&gt;
&lt;p&gt;I used the Zend for Eclipse theme, which has some soft colors.&lt;/p&gt;
&lt;h4&gt;Autocomplete&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_autocomplete.png"&gt;&lt;img alt="CodeLobster autocomplete" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_autocomplete-200x127.png" style="width: 200px; height: 127px; " width="200" height="127" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The autocomplete actually surprised me, because it detects the keys in the arrays. Nice.&lt;/p&gt;
&lt;h4&gt;PHP debugging&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_debug.png"&gt;&lt;img alt="CodeLobster PHP debugging" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_debug-200x163.png" style="width: 200px; height: 163px; " width="200" height="163" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Debugging is fundamental in a proper IDE. In this regard, CodeLobster didn’t fell short and the debugger was very easy to setup and worked correctly on the first try.&lt;/p&gt;
&lt;p&gt;I had my Apache server started, so I opened the debugger preferences and used the autodetect feature, which worked like a charm.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_config_debugging.png"&gt;&lt;img alt="CodeLobster PHP debugger settings" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_config_debugging-200x148.png" style="width: 200px; height: 148px; " width="200" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;FTP&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_ftp.png"&gt;&lt;img alt="CodeLobster FTP" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_ftp-200x102.png" style="width: 200px; height: 102px; " width="200" height="102" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Most IDEs come with FTP support. CodeLobster has a download and upload FTP feature that does just what it says.&lt;/p&gt;
&lt;p&gt;One thing that was driving me nuts was that it wasn’t obvious how to create an FTP connection. Apparently I wasn’t alone, so after digging in the &lt;a href="http://codelobster.com/forum/index.php"&gt;CodeLobster forums&lt;/a&gt; I found that to manage the FTP connections you have to go to the Explorer window. Not that intuitive, but from what I could find out, that is something that is going to change in future versions.&lt;/p&gt;
&lt;p&gt;After creating your connection, just open the project’s properties and choose the proper connection. Afterwards you can use the upload and download feature.&lt;/p&gt;
&lt;h4&gt;Source control support&lt;/h4&gt;
&lt;p&gt;CodeLobster comes with support for source control. It has limited support for GIT and SVN. I use TortoiseSVN and as of now there is no support for it in the IDE, although that is something that they are going to add in future versions.&lt;/p&gt;
&lt;p&gt;If you use SVN, the IDE supports &lt;a href="http://sourceforge.net/projects/win32svn/"&gt;Subversion for Windows&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Paid plugins&lt;/h4&gt;
&lt;p&gt;You can purchase plugins that add support for several CMSs and frameworks. I will focus on the Drupal plugin, but other plugins are similar. You can check the &lt;a href="http://www.codelobster.com"&gt;official CodeLobster site&lt;/a&gt; for more information on each plugin.&lt;/p&gt;
&lt;p&gt;Supported plugins:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;CakePHP plug-in&lt;/li&gt;
&lt;li&gt;CodeIgniter plug-in&lt;/li&gt;
&lt;li&gt;Drupal plug-in&lt;/li&gt;
&lt;li&gt;Facebook plug-in&lt;/li&gt;
&lt;li&gt;JQuery plug-in&lt;/li&gt;
&lt;li&gt;Joomla plug-in&lt;/li&gt;
&lt;li&gt;Smarty plug-in&lt;/li&gt;
&lt;li&gt;Symfony plug-in&lt;/li&gt;
&lt;li&gt;WordPress plug-in&lt;/li&gt;
&lt;li&gt;Yii plug-in&lt;/li&gt;
&lt;li&gt;SQL manager&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Drupal plugin for CodeLobster&lt;/h2&gt;
&lt;p&gt;I use Drupal so I was happy to find out that CodeLobster has a Drupal plugin. The plugin helps with project and module creation as well as some additional features.&lt;/p&gt;
&lt;p&gt;For creating a Drupal project you have two options: create an empty Drupal site (you can select the Drupal version and some additional details) or start with a “typical” Drupal site.&lt;/p&gt;
&lt;h4&gt;Project wizard: Typical Drupal site&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_create_project.png"&gt;&lt;img alt="CodeLobster create typical Drupal site project wizard" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_create_project-200x158.png" style="width: 200px; height: 158px; " width="200" height="158" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Typical Drupal Site template is only available for Drupal 6 and currently uses Drupal version 6.19, which is not the latest version. After creating the project you should update the site to the latest Drupal version, which includes several security fixes.&lt;/p&gt;
&lt;p&gt;The wizard offers several configuration options for creating the site. Some notes:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;You have to create the database yourself before finishing the wizard.&lt;/li&gt;
&lt;li&gt;Make sure the URL for the project is correct in the Admin tab or the wizard will fail.&lt;/li&gt;
&lt;li&gt;The Content tab lets you choose the type of content you want.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_create_project_database.png"&gt;&lt;img alt="CodeLobster create typical Drupal site project wizard: basic" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_create_project_database-100x77.png" style="width: 100px; height: 77px; " width="100" height="77" /&gt;&lt;/a&gt; &lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_create_project_admin.png"&gt;&lt;img alt="CodeLobster create typical Drupal site project wizard: admin" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_create_project_admin-100x77.png" style="width: 100px; height: 77px; " width="100" height="77" /&gt;&lt;/a&gt; &lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_create_project_content.png"&gt;&lt;img alt="CodeLobster create typical Drupal site project wizard: content" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_create_project_content-100x77.png" style="width: 100px; height: 77px; " width="100" height="77" /&gt;&lt;/a&gt; &lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_create_project_theme.png"&gt;&lt;img alt="CodeLobster create typical Drupal site project wizard: theme" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_create_project_theme-100x77.png" style="width: 100px; height: 77px; " width="100" height="77" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I wouldn’t use this wizard for my projects, not only because it uses Drupal 6, but also because I prefer to custom design everything. Although I like the fact that it comes with several custom modules that you can always tweak to your needs after creating the project.&lt;/p&gt;
&lt;h4&gt;Project wizard: Empty Drupal site&lt;/h4&gt;
&lt;p&gt;The Empy Drupal Site wizard is more to my liking. It allows you to choose which version of Drupal to install and as far as I could tell it downloads the latest version from the site (when you choose Drupal 7 at least), which is useful.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_create_project_empty_drupal.png"&gt;&lt;img alt="CodeLobster create empty Drupal site wizard" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_create_project_empty_drupal-200x154.png" style="width: 200px; height: 154px; " width="200" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This wizard will create the database and an empty Drupal site, but you can choose which modules to enable.&lt;/p&gt;
&lt;h4&gt;Drupal module wizard&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_plugin_wizards.png"&gt;&lt;img alt="CodeLobster create Drupal module option" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_plugin_wizards-200x125.png" style="width: 200px; height: 125px; " width="200" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was expecting the module’s wizard to be available when right-clicking the project or the modules folder, so it took me some time until I found the option on the plugins menu at the top.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_wizard_drupal_module.png"&gt;&lt;img alt="CodeLobster create Drupal module wizard" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_wizard_drupal_module-200x154.png" style="width: 200px; height: 154px; " width="200" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The wizard is a quick way of creating the folder with the basic module’s files. A small time-saver, but it helps to streamline your development process.&lt;/p&gt;
&lt;h4&gt;Drupal module hooks and autocomplete&lt;/h4&gt;
&lt;p&gt;The plugin makes it very easy to add your own hooks to your module.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_drupal_hooks.png"&gt;&lt;img alt="CodeLobster Drupal module hooks" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_drupal_hooks-200x110.png" style="width: 200px; height: 110px; " width="200" height="110" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not only that, but it has autocomplete for theme functions as well as Drupal forms.&lt;/p&gt;
&lt;h4&gt;Context help&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_context_help.png"&gt;&lt;img alt="CodeLobster Drupal context help" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_context_help-200x235.png" style="width: 200px; height: 235px; " width="200" height="235" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The context help will open your browser with the Drupal API page for that particular method or constant. No more Googling needed for that!&lt;/p&gt;
&lt;h4&gt;Find menu function&lt;/h4&gt;
&lt;p&gt;Another feature that the Drupal plugin supports is the ability to find a menu function by the menu path or vice-versa.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/codelobster_drupal_menu_path.png"&gt;&lt;img alt="CodeLobster Drupal find menu function" src="http://www.broculos.net/sites/default/files/resize/content/codelobster_drupal_menu_path-200x126.png" style="width: 200px; height: 126px; " width="200" height="126" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;CodeLobster is a nice, simple editor that you should consider if you are a PHP developer. I like its simplicity and speed. For me, the main issue right now is the lack of TortoiseSVN support (which will be added in the future).&lt;/p&gt;
&lt;p&gt;My second biggest complain is the lack of project profiles. For example, having a development profile where you can configure a local folder (or FTP) for copying files and a local URL to debug the site. Then you could have profiles for other environments (test, acceptance, production). You can always manually change the project properties each time, but it’s cumbersome. It’s not a killer feature, but it’s something that I would use a lot.&lt;/p&gt;
&lt;p&gt;Other than that, I can see myself using this IDE more often. The lack of availability for other operating systems might discourage some people. The addition of code snippets with autocomplete support is also something that would be nice to have in the future.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=ZJnjVlE9TuQ:nP5kg3oY0yA:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=ZJnjVlE9TuQ:nP5kg3oY0yA:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=ZJnjVlE9TuQ:nP5kg3oY0yA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=ZJnjVlE9TuQ:nP5kg3oY0yA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=ZJnjVlE9TuQ:nP5kg3oY0yA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=ZJnjVlE9TuQ:nP5kg3oY0yA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=ZJnjVlE9TuQ:nP5kg3oY0yA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=ZJnjVlE9TuQ:nP5kg3oY0yA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=ZJnjVlE9TuQ:nP5kg3oY0yA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=ZJnjVlE9TuQ:nP5kg3oY0yA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=ZJnjVlE9TuQ:nP5kg3oY0yA:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/ZJnjVlE9TuQ" height="1" width="1"/&gt;</description>
 <pubDate>Sat, 22 Oct 2011 18:23:25 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">105 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/news/giveaway-codelobster-php-ide-professional-edition</feedburner:origLink></item>
<item>
 <title>SharePoint 2010: People picker doesn't show any suggestions </title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/pRIq73aDqp8/sharepoint-2010-people-picker-doesnt-show-any-suggestions</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Bg0hj2om6AJDOmn5bs9Fv6fkiWQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bg0hj2om6AJDOmn5bs9Fv6fkiWQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Bg0hj2om6AJDOmn5bs9Fv6fkiWQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bg0hj2om6AJDOmn5bs9Fv6fkiWQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;The people picker field in SharePoint 2010 doesn't show any suggestions, even when it says it found matches to your query. I didn't test this thoroughly, but this seems to be the cause at least in the summary links webpart when you add a new link.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-peoplepicker-1.PNG" style="width: 526px; height: 450px; " /&gt;&lt;/p&gt;
&lt;p&gt;I tried clicking it as the error message stated. Even the tooltip mentioned there were available solutions.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-peoplepicker-2.PNG" style="width: 391px; height: 91px; " /&gt;&lt;/p&gt;
&lt;p&gt;I did click it and nothing happened. I became desperate, clicked it like crazy and then from some magical combination of clicking and typing the field height became bigger and this was visible:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-peoplepicker-3.PNG" style="width: 449px; height: 184px; " /&gt;&lt;/p&gt;
&lt;p&gt;Yes... the dropdown opened inside the text field. After inspecting the HTML and CSS I found this solution: &lt;/p&gt;
&lt;pre class="brush:css;"&gt;
body div.ms-inputuserfield {
    overflow-x: visible !Important;
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=pRIq73aDqp8:mgVGumoMnP0:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=pRIq73aDqp8:mgVGumoMnP0:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=pRIq73aDqp8:mgVGumoMnP0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=pRIq73aDqp8:mgVGumoMnP0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=pRIq73aDqp8:mgVGumoMnP0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=pRIq73aDqp8:mgVGumoMnP0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=pRIq73aDqp8:mgVGumoMnP0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=pRIq73aDqp8:mgVGumoMnP0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=pRIq73aDqp8:mgVGumoMnP0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=pRIq73aDqp8:mgVGumoMnP0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=pRIq73aDqp8:mgVGumoMnP0:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/pRIq73aDqp8" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 20 Oct 2011 14:11:44 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">103 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-2010-people-picker-doesnt-show-any-suggestions</feedburner:origLink></item>
<item>
 <title>Android SDK 4.0 is available for developers</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/7KdRyKi69yM/android-sdk-40-available-developers</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_2dhrBFJq-x_xNrdRM8lGGljcOM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_2dhrBFJq-x_xNrdRM8lGGljcOM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_2dhrBFJq-x_xNrdRM8lGGljcOM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_2dhrBFJq-x_xNrdRM8lGGljcOM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;The unified version of Android, for tablets and mobile phones alike, was officially announced and its SDK is already available for developers.&lt;/p&gt;
&lt;p&gt;The big highlight for this version is the unification of Android 2.x and Android 3.x, which simplifies the development and design of apps. &lt;/p&gt;
&lt;p&gt;New mentionable features in Android 4.0:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Social API&lt;/strong&gt;. Demonstrated through the new People app showed in the presentation. Android now provides a hub for you contact's social activities and not just a name-phone table of data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Android Beam. &lt;/strong&gt;NFC based, allows you to share information or establish a connection with another phone, by physically connecting them.&lt;/li&gt;
&lt;li&gt;Find more on the &lt;a href="http://developer.android.com/sdk/android-4.0-highlights.html#DeveloperApis"&gt;Android developers site&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You can also check out the whole presentation on Android 4.0 and the new Galaxy Nexus &lt;a href="http://www.youtube.com/watch?v=Ts5WBm0tXzI"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7KdRyKi69yM:Eg6ruqVhVyU:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7KdRyKi69yM:Eg6ruqVhVyU:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7KdRyKi69yM:Eg6ruqVhVyU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7KdRyKi69yM:Eg6ruqVhVyU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7KdRyKi69yM:Eg6ruqVhVyU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7KdRyKi69yM:Eg6ruqVhVyU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7KdRyKi69yM:Eg6ruqVhVyU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7KdRyKi69yM:Eg6ruqVhVyU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7KdRyKi69yM:Eg6ruqVhVyU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=7KdRyKi69yM:Eg6ruqVhVyU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=7KdRyKi69yM:Eg6ruqVhVyU:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/7KdRyKi69yM" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 19 Oct 2011 20:43:36 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">100 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/news/android-sdk-40-available-developers</feedburner:origLink></item>
<item>
 <title>SharePoint: How to use relative URLs in the masterpage, the right way</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/-ZQcL2jcvxg/sharepoint-how-use-relative-urls-masterpage-right-way</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5hQzGQdOS5dLybmjjx43FTg-Neo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5hQzGQdOS5dLybmjjx43FTg-Neo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5hQzGQdOS5dLybmjjx43FTg-Neo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5hQzGQdOS5dLybmjjx43FTg-Neo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;I've been using relative paths in SharePoint masterpages the wrong way. Let's see an example of how I used to do it, with a link to the homepage and an image for the logo.&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;a href="http://www.broculos.net/en" class="logo"&amp;gt;
	&amp;lt;img src="/Style Library/CustomStyle/Images/logo.png" alt="" /&amp;gt;
&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;p&gt;This will work like a charm if your site collection's home URL is the same as the root of the URL, for example: &lt;em&gt;&lt;a href="http://www.example.sp2010.dev/"&gt;http://www.example.sp2010.dev/&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If this is not the case, as in URLs like this one: &lt;em&gt;&lt;a href="http://www.example.sp2010.dev/sites/anothersitecolection/"&gt;http://www.example.sp2010.dev/sites/anothersitecolection/&lt;/a&gt;&lt;/em&gt; , my logo will still link to &lt;em&gt;&lt;a href="http://www.example.sp2010.dev/"&gt;http://www.example.sp2010.dev/&lt;/a&gt;&lt;/em&gt; and the image source will be also pointing to the wrong library. Here's how you should do it, and this will always work correctly:&lt;/p&gt;
&lt;pre class="brush:xml;"&gt;
&amp;lt;a href='&amp;lt;SharePoint:EncodedLiteral runat="server" text="&amp;lt;%$SPUrl:~SiteCollection/%&amp;gt;" EncodeMethod="HtmlEncode"/&amp;gt;' class="logo"&amp;gt;
	&amp;lt;img src='&amp;lt;SharePoint:EncodedLiteral runat="server" text="&amp;lt;%$SPUrl:~SiteCollection/Style Library/CustomStyle/Images/logo.png%&amp;gt;" EncodeMethod="HtmlEncode"/&amp;gt;' alt="" /&amp;gt;
&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=-ZQcL2jcvxg:VuPUZCfmVU4:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=-ZQcL2jcvxg:VuPUZCfmVU4:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=-ZQcL2jcvxg:VuPUZCfmVU4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=-ZQcL2jcvxg:VuPUZCfmVU4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=-ZQcL2jcvxg:VuPUZCfmVU4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=-ZQcL2jcvxg:VuPUZCfmVU4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=-ZQcL2jcvxg:VuPUZCfmVU4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=-ZQcL2jcvxg:VuPUZCfmVU4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=-ZQcL2jcvxg:VuPUZCfmVU4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=-ZQcL2jcvxg:VuPUZCfmVU4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=-ZQcL2jcvxg:VuPUZCfmVU4:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/-ZQcL2jcvxg" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 17 Oct 2011 14:05:35 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">98 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-how-use-relative-urls-masterpage-right-way</feedburner:origLink></item>
<item>
 <title>SharePoint 2010 Branding: Fancy search boxes with CSS only</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/Y5jaVAaA3cY/sharepoint-2010-branding-fancy-search-boxes-css-only</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oCbdkVqwIOGDNg3t-5pzl4HvMNQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oCbdkVqwIOGDNg3t-5pzl4HvMNQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oCbdkVqwIOGDNg3t-5pzl4HvMNQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oCbdkVqwIOGDNg3t-5pzl4HvMNQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;Want to spice up your SharePoint 2010 search boxes only using CSS? Here's an example of how you can achieve it.&lt;/p&gt;
&lt;p&gt;He will go from this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-fancysearch-2.PNG" style="width: 241px; height: 40px; " /&gt;&lt;/p&gt;
&lt;p&gt;To this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-fancysearch-1.PNG" style="width: 358px; height: 34px; " /&gt;&lt;/p&gt;
&lt;p&gt;The main idea behind my implementation is that I'll have a big background image for the whole search area (text input and button). Then, I will match the width and height of the elements to the width of the "fake elements" in the background image. To finish I only need to camouflage the controls, all borders and background colors need to go.&lt;/p&gt;
&lt;p&gt;To give you a better idea of how this works, here's the search box with the controls not hidden yet (you only see a small area for the button because the image inside it is to small, it should be the same with as the background button):&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-fancysearch-3.PNG" style="width: 361px; height: 39px; " /&gt;&lt;/p&gt;
&lt;p&gt;Here's the complete code I used to achieve this:&lt;/p&gt;
&lt;pre class="brush:css;"&gt;
#s4-searcharea {
    background: transparent url('/_layouts/images/custom/search-box.png') no-repeat scroll 0 0;    
    height: 30px; /* height of image */
    width: 354px; /* width of image */
}

.s4-search input.ms-sbplain {
    background: transparent;
    border-color: transparent !important;
    color: #9ca052;
    height: 23px;
    padding-left: 30px; /* to acomodate the magnifier icon */
    padding-top: 0 !important;   
    width: 247px !important;
}


#banner .ms-sbgo a {
    border-color: transparent !important;
    display: block;
    height: 30px;
    width: 70px !important;
}

#banner .ms-sbgo &amp;gt; a &amp;gt; img {
    display: none;
}&lt;/pre&gt;&lt;p&gt;Here's a couple of examples of the usage of this technique: &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-fancysearch-4.PNG" style="width: 299px; height: 41px; " /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-fancysearch-5.PNG" style="width: 299px; height: 44px; " /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Y5jaVAaA3cY:-3ugux5K9LA:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=Y5jaVAaA3cY:-3ugux5K9LA:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Y5jaVAaA3cY:-3ugux5K9LA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Y5jaVAaA3cY:-3ugux5K9LA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Y5jaVAaA3cY:-3ugux5K9LA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=Y5jaVAaA3cY:-3ugux5K9LA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Y5jaVAaA3cY:-3ugux5K9LA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=Y5jaVAaA3cY:-3ugux5K9LA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Y5jaVAaA3cY:-3ugux5K9LA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=Y5jaVAaA3cY:-3ugux5K9LA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Y5jaVAaA3cY:-3ugux5K9LA:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/Y5jaVAaA3cY" height="1" width="1"/&gt;</description>
 <pubDate>Tue, 20 Sep 2011 11:30:00 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">87 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-2010-branding-fancy-search-boxes-css-only</feedburner:origLink></item>
<item>
 <title>How to restore a SharePoint content database from a SQL Server backup</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/VQ_nZ7IyVgE/how-restore-sharepoint-content-database-sql-server-backup</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sFEsJU6EW1MHi-rHfc1eGbdg3b8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sFEsJU6EW1MHi-rHfc1eGbdg3b8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sFEsJU6EW1MHi-rHfc1eGbdg3b8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sFEsJU6EW1MHi-rHfc1eGbdg3b8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;There are several ways to backup and restore SharePoint content. &lt;a href="http://technet.microsoft.com/en-us/library/cc671616(office.12).aspx"&gt;SharePoint itself provides several backup and restore tools&lt;/a&gt;: either through the interface in &lt;em&gt;Central Administration&lt;/em&gt; or through the command line with &lt;em&gt;STSADM&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In this article I will discuss a different approach: how to restore a backup from SQL Server of a SharePoint content database. It's common to have a scheduled backup plan in a SQL Server, so it's a good alternative when the other methods aren't available.&lt;/p&gt;
&lt;p&gt;The biggest hurdle you will have is making sure your database is not in use when you want to do the restore, because SharePoint has a lot of processes that will access your database, even if no one is visiting the site.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Stop &lt;em&gt;Windows SharePoint Services Timer&lt;/em&gt;
&lt;ul&gt;&lt;li&gt;Go to &lt;em&gt;Administrative Tools&lt;/em&gt; and open &lt;em&gt;Services&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Locate the &lt;em&gt;Windows SharePoint Services Timer&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Open its properties, make sure the &lt;em&gt;Startup type&lt;/em&gt; is set to &lt;em&gt;Manual&lt;/em&gt; and stop the service.&lt;/li&gt;
&lt;li&gt;Wait a few minutes for all running procedures to complete.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Kill any processes accessing your database
&lt;ul&gt;&lt;li&gt;Open &lt;em&gt;SQL Server Management Studio&lt;/em&gt; and connect to your database server.&lt;/li&gt;
&lt;li&gt;Expand &lt;em&gt;Management&lt;/em&gt; and double-click on &lt;em&gt;Activity Monitor&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Right-click each process that's using your database and kill it or wait for it to finish.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Execute the restore script
&lt;ul&gt;&lt;li&gt;Open a new query script.&lt;/li&gt;
&lt;li&gt;You can use the following script, which will set the database access to single user to avoid any more database locks and then puts it back as it was in the end.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="brush:sql;"&gt;
USE MASTER
ALTER DATABASE [DATABASE_NAME] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
RESTORE DATABASE [DATABASE_NAME] FROM  DISK = 'D:\PATH\Backup.bak' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10
ALTER DATABASE [DATABASE_NAME] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO&lt;/pre&gt;&lt;p&gt;Don't forget to start the &lt;em&gt;Windows SharePoint Services Timer&lt;/em&gt; again:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Go to &lt;em&gt;Administrative Tools&lt;/em&gt; and open &lt;em&gt;Services&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Locate the &lt;em&gt;Windows SharePoint Services Timer&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Open its properties, make sure the &lt;em&gt;Startup type&lt;/em&gt; is set to &lt;em&gt;Automatic&lt;/em&gt; and start the service.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VQ_nZ7IyVgE:LKj0BqNamw0:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=VQ_nZ7IyVgE:LKj0BqNamw0:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VQ_nZ7IyVgE:LKj0BqNamw0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VQ_nZ7IyVgE:LKj0BqNamw0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VQ_nZ7IyVgE:LKj0BqNamw0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=VQ_nZ7IyVgE:LKj0BqNamw0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VQ_nZ7IyVgE:LKj0BqNamw0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=VQ_nZ7IyVgE:LKj0BqNamw0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VQ_nZ7IyVgE:LKj0BqNamw0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=VQ_nZ7IyVgE:LKj0BqNamw0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=VQ_nZ7IyVgE:LKj0BqNamw0:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/VQ_nZ7IyVgE" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 08 Sep 2011 17:11:43 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">94 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/how-restore-sharepoint-content-database-sql-server-backup</feedburner:origLink></item>
<item>
 <title>How to detect if JavaScript is enabled from the server side in C#/.NET</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/r0012p9vggw/how-detect-if-javascript-enabled-server-side-cnet</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/u1D49LpNTCxFbWTnWl-j3AZDmkw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u1D49LpNTCxFbWTnWl-j3AZDmkw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/u1D49LpNTCxFbWTnWl-j3AZDmkw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u1D49LpNTCxFbWTnWl-j3AZDmkw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;In .NET there is no out-of-the-box way of detecting if JavaScript is enabled from the server side (you can detect if JavaScript is supported, but the user could have disabled it). You can achieve this using several techniques. In this article I will explain how to achieve this using .NET's PageMethods.&lt;/p&gt;
&lt;h2&gt;PageMethods in .NET&lt;/h2&gt;
&lt;p&gt;PageMethods, as the name implies, are methods that belong to an ASP.NET page, but with a catch - they can be called from the client side as if they were part of a Web Service, but without having to actually build one.&lt;/p&gt;
&lt;p&gt;A PageMethod must be a public static method and must be marked with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.services.webmethodattribute.aspx"&gt;WebMethod attribute&lt;/a&gt;. Besides that, you need to a have a &lt;a href="http://msdn.microsoft.com/en-us/library/bb344905.aspx"&gt;ScriptManager&lt;/a&gt; on the page with &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.enablepagemethods.aspx"&gt;EnablePageMethods&lt;/a&gt; set to true.&lt;/p&gt;
&lt;p&gt;This technique allows you to call server side methods from the client side without the burden of having to build a complete Web Service - .NET will do all the hard work behind the scenes.&lt;/p&gt;
&lt;h2&gt;Detecting if JavaScript is enabled&lt;/h2&gt;
&lt;p&gt;The logic behind this solution is that JavaScript will be used to call a server side method that will store in a session variable a value indicating whether JavaScript is enabled. If JavaScript is not enabled, the method will never be called and so it is safe to assume that JavaScript is disabled.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;p&gt;This is all the code you need:&lt;/p&gt;
&lt;pre class="brush:csharp;"&gt;
public class DetectJavascriptPage : System.Web.UI.Page {
	protected const string JAVASCRIPT_ENABLED_KEY = "JavascriptEnabled";

	public bool IsJavascriptEnabled { get { return GetJavascriptEnabled(); } }

	protected override void OnPreRender( EventArgs e ) {
		base.OnPreRender( e );

		// Verify that the startup script isn't already registered (postbacks)
		if (!this.ClientScript.IsStartupScriptRegistered("JavascriptTest_Startup"))
		{
			// Form the script to be registered at client side.
			StringBuilder sb = new StringBuilder();
			sb.Append("&amp;lt;script lang='javascript'&amp;gt;");
			sb.Append("PageMethods.SetJavascriptEnabled(true, SetJavascriptOnSucceeded, SetJavascriptOnFailed);");
			sb.Append("function SetJavascriptOnSucceeded() { }");
			sb.Append("function SetJavascriptOnFailed(error) { }");
			sb.Append("&amp;lt;/script&amp;gt;");

			// Register the startup script
			this.ClientScript.RegisterStartupScript(typeof(JavascriptTest), "JavascriptTest_Startup", sb.ToString());
		}
	}

	[WebMethod]
	public static void SetJavascriptEnabled(bool enabled)
	{
		if (HttpContext.Current.Session[JAVASCRIPT_ENABLED_KEY] != null)
		{
			HttpContext.Current.Session[JAVASCRIPT_ENABLED_KEY] = enabled;
		}
		else
		{
			HttpContext.Current.Session.Add(JAVASCRIPT_ENABLED_KEY, enabled);
		}
	}

	[WebMethod]
	public static bool GetJavascriptEnabled()
	{
		if (HttpContext.Current.Session[JAVASCRIPT_ENABLED_KEY] != null)
		{
			return (bool)HttpContext.Current.Session[JAVASCRIPT_ENABLED_KEY];
		}

		return false;
	}
}&lt;/pre&gt;&lt;p&gt;During pre render we will include JavaScript code to call the page method, which in turn will set a session variable. For knowing whether JavaScript is enabled or not, all you have to do is use the property &lt;em&gt;IsJavascriptEnabled&lt;/em&gt; that was added to the page class.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=r0012p9vggw:e0sF9azPeqA:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=r0012p9vggw:e0sF9azPeqA:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=r0012p9vggw:e0sF9azPeqA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=r0012p9vggw:e0sF9azPeqA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=r0012p9vggw:e0sF9azPeqA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=r0012p9vggw:e0sF9azPeqA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=r0012p9vggw:e0sF9azPeqA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=r0012p9vggw:e0sF9azPeqA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=r0012p9vggw:e0sF9azPeqA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=r0012p9vggw:e0sF9azPeqA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=r0012p9vggw:e0sF9azPeqA:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/r0012p9vggw" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 25 Aug 2011 21:26:10 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">92 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/how-detect-if-javascript-enabled-server-side-cnet</feedburner:origLink></item>
<item>
 <title>SharePoint 2010 Branding: Show the title area when the ribbon is expanded</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/8MAV3wDeaVw/sharepoint-2010-branding-show-title-area-when-ribbon-expanded</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AawEaNtiYKw0MQoWV4NQS5j7mk0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AawEaNtiYKw0MQoWV4NQS5j7mk0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AawEaNtiYKw0MQoWV4NQS5j7mk0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AawEaNtiYKw0MQoWV4NQS5j7mk0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;When the ribbon is expanded, by default, the entire title area disappears. This is usually something that clients dislike, so making it always visible is something I usually have to do.&lt;/p&gt;
&lt;p&gt;Ribbon collapsed:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-showtitle-1.PNG" style="width: 700px; height: 143px; " /&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Ribbon expanded, the title area is gone:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-showtitle-2.PNG" style="width: 700px; height: 189px; " /&gt;&lt;/p&gt;
&lt;p&gt;So we need to override the declaration that hides the ribbon.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-showtitle-3.PNG" style="width: 700px; height: 131px; " /&gt;&lt;/p&gt;
&lt;p&gt;How to do this? Add this rule to you CSS:&lt;/p&gt;
&lt;pre class="brush:css;"&gt;
#s4-titlerow { 
    display: block !important; 
}&lt;/pre&gt;&lt;p&gt;Now the title area is visible. When the ribbon opens it "pushes" the title area down:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-showtitle-4.PNG" style="width: 700px; height: 233px; " /&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8MAV3wDeaVw:mgrlTJ3Eb_0:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=8MAV3wDeaVw:mgrlTJ3Eb_0:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8MAV3wDeaVw:mgrlTJ3Eb_0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8MAV3wDeaVw:mgrlTJ3Eb_0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8MAV3wDeaVw:mgrlTJ3Eb_0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=8MAV3wDeaVw:mgrlTJ3Eb_0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8MAV3wDeaVw:mgrlTJ3Eb_0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=8MAV3wDeaVw:mgrlTJ3Eb_0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8MAV3wDeaVw:mgrlTJ3Eb_0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=8MAV3wDeaVw:mgrlTJ3Eb_0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=8MAV3wDeaVw:mgrlTJ3Eb_0:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/8MAV3wDeaVw" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 08 Aug 2011 07:00:08 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">83 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-2010-branding-show-title-area-when-ribbon-expanded</feedburner:origLink></item>
<item>
 <title>SharePoint BDC: Creating an ADF with the Microsoft BDC Definition Editor</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/Zo_UI1U59JE/sharepoint-bdc-creating-adf-microsoft-bdc-definition-editor</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hI6MJMaNhmb4eIGtxx5Gvb0iV7Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hI6MJMaNhmb4eIGtxx5Gvb0iV7Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hI6MJMaNhmb4eIGtxx5Gvb0iV7Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hI6MJMaNhmb4eIGtxx5Gvb0iV7Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;Business Data Catalog (BDC) allows you to integrate an external database in your SharePoint environment. To do so, you need to create an Application Definition File (ADF) and import it to SharePoint.&lt;/p&gt;
&lt;p&gt;An ADF is basically an XML file with all the necessary information describing the entities and methods to access the database. There are some paid tools to help you generate ADFs, but Microsoft itself offers a free tool to create them.&lt;/p&gt;
&lt;p&gt;In this article, I will describe how to get this tool and some annoyances I found along the way.&lt;/p&gt;
&lt;h2&gt;Install the BDC Definition Editor&lt;/h2&gt;
&lt;p&gt;The BDC Definition Editor from Microsoft is included in the &lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=79"&gt;SharePoint Server 2007 SDK&lt;/a&gt;. After installing the SDK, you can find the setup for the BDC Definition Editor at &lt;em&gt;"C:\Program Files\2007 Office System Developer Resources\Tools\BDC Definition Editor"&lt;/em&gt; (by default).&lt;/p&gt;
&lt;p&gt;If you want to install the BDC Definition Editor on another machine, you can just copy the entire folder and run it elsewhere. Supported environments are Windows Server 2003 (En-US only) and Windows XP (En-US only). The installation file that you want to run is &lt;em&gt;setup.exe&lt;/em&gt;. This will ensure that all the requirements are installed and, if not, it will install them:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Microsoft .NET Framework 2.0&lt;/li&gt;
&lt;li&gt;Microsoft SQL Server 2005 Express Edition&lt;/li&gt;
&lt;li&gt;Windows Installer 3.1&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;It's basically a 90MB install for a 2MB tool. Go figure.&lt;/p&gt;
&lt;p&gt;Once it's installed, you can find the tool in the Start Menu at &lt;em&gt;ApplicationDefinitionDesigner.exe&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Creating the Application Definition File&lt;/h2&gt;
&lt;p&gt;I don't want to dwell too much on the use of the Application Definition Designer (aka BDC Definition Editor), because it's pretty straightforward:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Start by adding a new LOB system (if you already have one created you can import it).&lt;/li&gt;
&lt;li&gt;Choose "Connect to Database".&lt;/li&gt;
&lt;li&gt;Type your connection string (if you aren't sure how to write one you can check some &lt;a href="http://www.connectionstrings.com/sql-server-2005"&gt;SQL Server 2005 connection string samples here&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;You will see a listing of all the tables. Drag the ones you need and then make any necessary adjustments you see fit (e.g. exclude some fields).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/content/application_definition_editor.png" style="width: 466px; height: 451px; " width="466" height="451" /&gt;&lt;/p&gt;
&lt;p&gt;After doing this, creating the ADF is pretty easy. Just use the Export button and save the file.&lt;/p&gt;
&lt;h3&gt;Finder method for the Business Data List web part&lt;/h3&gt;
&lt;p&gt;Before you export the file, let me tell you about a caveat. For a reason I cannot phantom, the Application Definition Designer doesn't generate a method that the Business Data List web part relies upon to display data. In fact, if you import the ADF as it is, you will see the following error in the Business Data List web part:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;"There are no Business Data Types loaded in the Catalog"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The strange thing is that it can easily be fixed. The web part is searching for a Finder method in the BDC entity, but the BDC Definition Editor by Microsoft doesn't generate one by default, though it generates two other methods for fetching data. One of these methods can easily be changed to a Finder method, instead of having to create your own.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div id="gam-holder-Broculos_Articles_BTF_InlineLeft_468x60" class="gam-holder"&gt;
&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleAddSlot("ca-pub-8275061180575141", "Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
&lt;!--//--&gt;&lt;![CDATA[// &gt;&lt;!--
GA_googleFillSlot("Broculos_Articles_BTF_InlineLeft_468x60");
//--&gt;&lt;!]]&gt;
&lt;/script&gt;&lt;/div&gt;

&lt;p&gt;To fix this, go to the Application Definition Designer. For each entity you want to use in the Business Data List web part:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Expand &lt;em&gt;Methods&lt;/em&gt; &amp;gt; &lt;em&gt;FindAll_EntityName&lt;/em&gt; &amp;gt; &lt;em&gt;Instances&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select the instance (&lt;em&gt;FindAll_EntityName_Instance&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;In the property &lt;em&gt;MethodInstanceType&lt;/em&gt; select &lt;em&gt;Finder&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;One last thing you might want to do is add some more output parameters to the method or it will only show the primary key by default, which is probably not that desirable.&lt;/p&gt;
&lt;h3&gt;Using SQL Authentication&lt;/h3&gt;
&lt;p&gt;If you're using SQL authentication you need to add some extra properties to your LOB System instance:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Select your instance.&lt;/li&gt;
&lt;li&gt;Make sure &lt;em&gt;AuthenticationMode&lt;/em&gt; is &lt;em&gt;PassThrough&lt;/em&gt; and &lt;em&gt;DatabaseAccessProvider&lt;/em&gt; is &lt;em&gt;SqlServer&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Browse to the &lt;em&gt;Properties&lt;/em&gt; collection.&lt;/li&gt;
&lt;li&gt;Add these properties:
&lt;ul&gt;&lt;li&gt;RdbConnection Data Source: the SQL server address&lt;/li&gt;
&lt;li&gt;RdbConnection Initial Catalog: the name of the database&lt;/li&gt;
&lt;li&gt;RdbConnection User ID: username&lt;/li&gt;
&lt;li&gt;RdbConnection Password: password&lt;/li&gt;
&lt;li&gt;RdbConnection Integrated Security: set this to false&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/content/adf_sql_authentication_properties.png" style="width: 585px; height: 315px; " width="585" height="315" /&gt;&lt;/p&gt;
&lt;h2&gt;Import the ADF to SharePoint&lt;/h2&gt;
&lt;p&gt;Now you need to import your ADF into SharePoint. It's pretty simple:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Open Central Administration.&lt;/li&gt;
&lt;li&gt;Go to the Shared Services Provider (SSP) of the desired application.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Business Data Catalog&lt;/em&gt; choose &lt;em&gt;Import application definition&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Browse to your file and import it.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/content/ssp_business_data_catalog.png" style="width: 227px; height: 168px; " width="227" height="168" /&gt;&lt;/p&gt;
&lt;p&gt;Once it's imported, you'll be able to check the entities. One more thing you probably want to do is change the access permissions of the BDC. You can do it one by one for each BDC entity, but it's much easier if you change for all of them at the same time:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;In the page of your BDC application select &lt;em&gt;Manage Permissions&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Add all the accounts you need using &lt;em&gt;Add Users/Groups&lt;/em&gt; (you probably want &lt;em&gt;NT AUTHORITY\Authenticated Users&lt;/em&gt; with &lt;em&gt;Select in Clients&lt;/em&gt; permissions).&lt;/li&gt;
&lt;li&gt;Now click &lt;em&gt;Copy all permissions to descendants&lt;/em&gt; (this will make sure that the permissions are copied to all the BDC entities).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.broculos.net/sites/default/files/content/bdc_permissions.png"&gt;&lt;img alt="" src="http://www.broculos.net/sites/default/files/resize/content/bdc_permissions-585x99.png" style="width: 585px; height: 99px; " width="585" height="99" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Using the Business Data Catalog web parts&lt;/h2&gt;
&lt;p&gt;Now that you imported the ADF and have your BDC Application setup, you can use the BDC web parts that SharePoint provides (make sure you have the necessary features activated).&lt;/p&gt;
&lt;p&gt;When you add a web part, under Business Data, you'll find several web parts that connect to your BDC. One of the most common to use is the Business Data List web part. Once you add it, you need to edit its properties and choose the entity you want to display.&lt;/p&gt;
&lt;p&gt;You can also pair a Business Data List with a Business Data Item web part, which displays the details of a single row. To do that, first add a Business Data Item web part and then on the edit context menu of the Business Data List web part choose Connections &amp;gt; Send Selected Item To and select the Business Data Item web part instance. Now when you select on of the rows in the Business Data List web part, its details will show in the Business Data Item web part.&lt;/p&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.zimmergren.net/archive/2009/06/25/sharepoint-bdc-part-1-getting-started-with-the-business-data-catalog.aspx"&gt;SharePoint BDC Part 1: Getting Started with the Business Data Catalog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://demiliani.com/blog/archive/2008/07/14/6488.aspx"&gt;MOSS BDC and Business Data List Web Part&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.itsallaboutsharepoint.co.uk/2010/04/22/bdc-lobsysteminstance-for-sql-database-with-sql-authentication/"&gt;BDC LobSystemInstance for SQL database with SQL Authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Zo_UI1U59JE:iv6MpRHZ6Uo:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=Zo_UI1U59JE:iv6MpRHZ6Uo:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Zo_UI1U59JE:iv6MpRHZ6Uo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Zo_UI1U59JE:iv6MpRHZ6Uo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Zo_UI1U59JE:iv6MpRHZ6Uo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=Zo_UI1U59JE:iv6MpRHZ6Uo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Zo_UI1U59JE:iv6MpRHZ6Uo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=Zo_UI1U59JE:iv6MpRHZ6Uo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Zo_UI1U59JE:iv6MpRHZ6Uo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=Zo_UI1U59JE:iv6MpRHZ6Uo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=Zo_UI1U59JE:iv6MpRHZ6Uo:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/Zo_UI1U59JE" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 04 Aug 2011 20:46:46 +0000</pubDate>
 <dc:creator>nunof</dc:creator>
 <guid isPermaLink="false">90 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-bdc-creating-adf-microsoft-bdc-definition-editor</feedburner:origLink></item>
<item>
 <title>SharePoint 2010 Branding: Fix standard layout alignment on pages with wider content</title>
 <link>http://feedproxy.google.com/~r/Broculosnet/~3/RtCU8uKc-Og/sharepoint-2010-branding-fix-standard-layout-alignment-pages-wider-content</link>
 <description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xXn2w-7ihT8ruuowmnZz6nRf--M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xXn2w-7ihT8ruuowmnZz6nRf--M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xXn2w-7ihT8ruuowmnZz6nRf--M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xXn2w-7ihT8ruuowmnZz6nRf--M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even" property="content:encoded"&gt;&lt;p&gt;In the standard SharePoint 2010 layout there’s a bug in the layout that keeps the title as big as the window width, even if the content stretches outside of that width.&lt;/p&gt;
&lt;p&gt;Let’s see the Master Page and Page layout gallery, for example. If your window is too small you’ll need to use the horizontal scrollbar to see the complete table. When this happens the title area will only stretch to the size of the window, leaving a gap to the right:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-widepage-1.PNG" style="width: 700px; height: 296px; " /&gt;&lt;/p&gt;
&lt;p&gt;Here's how you do it:&lt;/p&gt;
&lt;pre class="brush:css;"&gt;
body #s4-bodyContainer,
div#s4-workspace {
    float: left;
}

#s4-titlerow {	
    width: 100%;
}
&lt;/pre&gt;&lt;p&gt;And here you go:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://broculos.net/sites/default/files/content/sp2010-widepage-2.PNG" style="width: 700px; height: 350px; " /&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=RtCU8uKc-Og:7_MkjbhBdlU:dcEpXCkpeq4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=RtCU8uKc-Og:7_MkjbhBdlU:dcEpXCkpeq4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=RtCU8uKc-Og:7_MkjbhBdlU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=RtCU8uKc-Og:7_MkjbhBdlU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=RtCU8uKc-Og:7_MkjbhBdlU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=RtCU8uKc-Og:7_MkjbhBdlU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=RtCU8uKc-Og:7_MkjbhBdlU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=RtCU8uKc-Og:7_MkjbhBdlU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=RtCU8uKc-Og:7_MkjbhBdlU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?i=RtCU8uKc-Og:7_MkjbhBdlU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Broculosnet?a=RtCU8uKc-Og:7_MkjbhBdlU:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Broculosnet?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Broculosnet/~4/RtCU8uKc-Og" height="1" width="1"/&gt;</description>
 <pubDate>Tue, 02 Aug 2011 13:30:09 +0000</pubDate>
 <dc:creator>dsilva</dc:creator>
 <guid isPermaLink="false">81 at http://www.broculos.net</guid>
<feedburner:origLink>http://www.broculos.net/en/article/sharepoint-2010-branding-fix-standard-layout-alignment-pages-wider-content</feedburner:origLink></item>
</channel>
</rss>

