Tuesday, December 29, 2009
Live Soccer Score Bolton v Hull
Live Soccer Score Saudi Arabia v Kuwait
Live Soccer Score Tunisia v Côte d'Ivoire
Live Soccer Score Aston Villa v Liverpool
Sunday, December 27, 2009
Live Soccer Score Peterborough United v Cardiff City
Live Soccer Score Newcastle United v Derby County
Live Soccer Score Barnsley v Middlesbrough
Live Soccer Score Wolverhampton Wanderers v Manchester City
Live Soccer Score Stoke City v Birmingham City
Live Soccer Score Nottingham Forest v Coventry City
Live Soccer Score Tottenham Hotspur v West Ham United
Live Soccer Score Blackburn Rovers v Sunderland
Live Soccer Score Chelsea v Fulham
Live Soccer Score Everton v Burnley
Live Soccer Score Swansea City v Crystal Palace
Live Soccer Score Plymouth Argyle v Reading
Live Soccer Score Qatar v Iran
Blogger: Bisa Kaya, Bisa Masuk Penjara
Friday, December 25, 2009
Pakistan v Australia 1st Test Live in Melbourne on Dec 26 2009
Live Cricket Score Here
Big Picture
Australia and Pakistan will take place on the 26th of December at the Melbourne Cricket Ground. The Aussies are returning after a close win in the test series against the West Indies.If Pakistan feel they have the better spinners in Danish Kaneria and Saeed Ajmal, Australia will be more than confident that their batting is by far the stronger.
Pakistan have no such injury concerns though a niggle to the fourth finger on Danish Kaneria's spinning hand is being looked at. There is talk in the camp of playing an extra spinner in place of a fast bowler. Pakistan will not readily dismantle the pace trio that served them so well in New Zealand.
the Aussies would be missing the services of Ben Hilfenhaus, who has failed to recover from his knee problem while Nathan Hauritz, who is suffering from a groin injury, is also a doubtful starter. His absence may pave way young leggie Steven Smith.
While Pakistan would be a lot more happier after Umar Gul survived an injury scare and was declared fit by the doctors, their concern would be the availability of Kaneria, as the leggie has injured his finger.
Australia squad | |
RT Ponting*, MJ Clarke, DE Bollinger, BJ Haddin†, NM Hauritz, PJ Hughes, MEK Hussey, MG Johnson, SM Katich, CJ McKay, MJ North, PM Siddle, SPD Smith, SR Watson |
Pakistan squad | |
Mohammad Yousuf*, Abdur Rauf, Danish Kaneria, Faisal Iqbal, Fawad Alam, Imran Farhat, Kamran Akmal†, Khurram Manzoor, Misbah-ul-Haq, Mohammad Aamer, Mohammad Asif, Mohammad Sami, Saeed Ajmal, Salman Butt, Shoaib Malik, Umar Akmal, Umar Gul |
Live Cricket Score Here
Fulham v Tottenham Live Barclays Premier League
Tottenham have a poor recent record against Fulham, having won just once in the league (a 5-1 win in December 2007) in their last seven Premier League
Fulham will be looking to build on their excellent performance from last weekend and move into the European places when they welcome Tottenham Hotspur to Craven Cottage on Saturday.
Fulham gave a great illustration of this ability with a convincing 3-0 win over champions Manchester United last time out, capping a couple of months of fine results.Tottenham Provisional squad:
Gomes, Alnwick, Corluka, Naughton, Assou-Ekotto, Bale, King, Dawson, Bassong, Lennon, Bentley, Kranjcar, Modric, Palacios, Jenas, Huddlestone, Keane, Defoe, Pavlyuchenko, Crouch, Rose. Fulham Provisional squad:
Schwarzer, Zuberbuhler, Konchesky, Pantsil, Hangeland, Baird, Smalling, Kelly, Hughes, Etuhu, Murphy, Dempsey, Gera, Riise, Greening, Duff, E Johnson, Nevland, Zamora, A Johnson.
Live Soccer Here
Chelsea v Birmingham Live Barclays Premier League
Chelsea Provisional squad:
Cech, Hilario, Turnbull, Ivanovic, Belletti, Alex, Carvalho, Terry, A Cole, Lampard, Ballack, Obi, Malouda, J Cole, Zhirkov, Drogba, Kalou, Kakuta, Bruma, Borini, Sturridge, Matic.Birmingham Provisional squad:
Hart, Carr, Roger Johnson, Dann, Ridgewell, Larsson, Ferguson, Bowyer, McFadden, Jerome, Benitez, Maik Taylor, Fahey, Vignal, Carsley, Phillips, McSheffrey, Damien Johnson, Queudrue, Parnaby.
Live Soccer Score
Monday, December 21, 2009
Sanofi-Aventis to Buy $1.9 billion Chattem Inc.
Sanofi-Aventis agreed to buy Chattem Inc., Bond medicated body powder maker, for $1.9 billion to expand in consumer health-care in the U.S.
Sanofi will pay $93.50 a share in cash, 34 percent above Chattem’s closing price Dec. 18, the Paris-based drugmaker said in an e-mailed statement. After Purchase Sanofi will create the world’s fifth-largest consumer health-care company by revenue, Sanofi said today.
The acquisition is the second-biggest by Sanofi Chief Executive Officer Chris Viehbacher since he joined the drugmaker a year ago. He’s done more than a dozen deals in emerging markets, vaccines and now consumer products to replace revenue that will be lost to generic competition. Products that account for 20 percent of Sanofi’s annual sales will lose patent protection by 2013.
Chattem, based in Chattanooga, Tennessee, was founded 130 years ago. The company’s products include Selsun Blue dandruff shampoo and Icy Hot pain relief products.
The New Google Phone brings the power of the internet in your pocket
Google has been saying for some time to expect numerous Android models to hit the U.S. market. The Journal said the search giant is looking forward to seeing around 18 different models this year. Despite these announcements and predictions, so far only the G1 has appeared in the U.S.
The Nexus One could add Google's powerful imprimatur to an already budding movement to free customers from long contracts in exchange for higher upfront prices on mobile hardware.
Unlocked phones of varying quality are widely available online, Keiter points out. But what Google brings to the table is significant advertising power, brand cachet, and a product potentially enticing enough to hammer open mobile providers' "iron clad" control over what gadgets their customers can wield.
The Google Phone brings the power of the internet in your pocket, in a simple and intuitive device. It combines the traditional voice and SMS capabilities of phones with all the exciting Google services from the PC such as Search, Gmail, Maps, Blogger…
Google is supposedly in the process of testing its own phone and may be set to release it as early as 2010. The plan, according to the rumor mill, is to release the device without a carrier partner—a strategy that is near unheard of here in the US and could force some carriers to put up or shut up when it comes to welcoming just any device onto their networks
Friday, December 18, 2009
Hello, Stack Overflow!
Over the past year, an Android presence has been growing on a relatively new technical Q&A web site called Stack Overflow. The site was designed specifically for programmers, with features like syntax highlighting, tagging, user reputation, and community editing. It's attracted a loyal software developer community, and developers continue to express great praise for this new tool. Well, the Android team has been listening...and we agree.
Today, I'm happy to announce that we're working with Stack Overflow to improve developer support, especially for developers new to Android. In essence, the Android tag on Stack Overflow will become an official Android app development Q&A medium. We encourage you to post your beginner-level technical questions there. It's also important to point out that we don't plan to change the android-developers group, so intermediate and expert users should still feel free to post there.
I think that this will be a great new resource for novice Android developers, and our team is really excited to participate in the growth of the Android developer community on Stack Overflow. I hope to see you all there!
Back and other hard keys: three stories
Android 2.0 introduces new behavior and support for handling hard keys such as BACK
and MENU
, including some special features to support the virtual hard keys that are appearing on recent devices such as Droid.
This article will give you three stories on these changes: from the most simple to the gory details. Pick the one you prefer.
Story 1: Making things easier for developers
If you were to survey the base applications in the Android platform, you would notice a fairly common pattern: add a little bit of magic to intercept the BACK
key and do something different. To do this right, the magic needs to look something like this:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
// do something on back.
return true;
}
return super.onKeyDown(keyCode, event);
}
How to intercept the BACK key in an Activity is also one of the common questions we see developers ask, so as of 2.0 we have a new little API to make this more simple and easier to discover and get right:
@Override
public void onBackPressed() {
// do something on back.
return;
}
If this is all you care about doing, and you're not worried about supporting versions of the platform before 2.0, then you can stop here. Otherwise, read on.
Story 2: Embracing long press
One of the fairly late addition to the Android platform was the use of long press on hard keys to perform alternative actions. In 1.0 this was long press on HOME
for the recent apps switcher and long press on CALL for the voice dialer. In 1.1 we introduced long press on SEARCH
for voice search, and 1.5 introduced long press on MENU to force the soft keyboard to be displayed as a backwards compatibility feature for applications that were not yet IME-aware.
(As an aside: long press on MENU
was only intended for backwards compatibility, and thus has some perhaps surprising behavior in how strongly the soft keyboard stays up when it is used. This is not intended to be a standard way to access the soft keyboards, and all apps written today should have a more standard and visible way to bring up the IME if they need it.)
Unfortunately the evolution of this feature resulted in a less than optimal implementation: all of the long press detection was implemented in the client-side framework's default key handling code, using timed messages. This resulted in a lot of duplication of code and some behavior problems; since the actual event dispatching code had no concept of long presses and all timing for them was done on the main thread of the application, the application could be slow enough to not update within the long press timeout.
In Android 2.0 this all changes, with a real KeyEvent API and callback functions for long presses. These greatly simplify long press handling for applications, and allow them to interact correctly with the framework. For example: you can override Activity.onKeyLongPress()
to supply your own action for a long press on one of the hard keys, overriding the default action provided by the framework.
Perhaps most significant for developers is a corresponding change in the semantics of the BACK key. Previously the default key handling executed the action for this key when it was pressed, unlike the other hard keys. In 2.0 the BACK key is now execute on key up. However, for existing apps, the framework will continue to execute the action on key down for compatibility reasons. To enable the new behavior in your app you must set android:targetSdkVersion
in your manifest to 5 or greater.
Here is an example of code an Activity subclass can use to implement special actions for a long press and short press of the CALL
key:
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CALL) {
// a long press of the call key.
// do our work, returning true to consume it. by
// returning true, the framework knows an action has
// been performed on the long press, so will set the
// canceled flag for the following up event.
return true;
}
return super.onKeyLongPress(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CALL && event.isTracking()
&& !event.isCanceled()) {
// if the call key is being released, AND we are tracking
// it from an initial key down, AND it is not canceled,
// then handle it.
return true;
}
return super.onKeyUp(keyCode, event);
}
Note that the above code assumes we are implementing different behavior for a key that is normally processed by the framework. If you want to implement long presses for another key, you will also need to override onKeyDown to have the framework track it:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_0) {
// this tells the framework to start tracking for
// a long press and eventual key up. it will only
// do so if this is the first down (not a repeat).
event.startTracking();
return true;
}
return super.onKeyDown(keyCode, event);
}
Story 3: Making a mess with virtual keys
Now we come to the story of our original motivation for all of these changes: support for virtual hard keys, as seen on the Droid and other upcoming devices. Instead of physical buttons, these devices have a touch sensor that extends outside of the visible screen, creating an area for the "hard" keys to live as touch sensitive areas. The low-level input system looks for touches on the screen in this area, and turns these into "virtual" hard key events as appropriate.
To applications these basically look like real hard keys, though the generated events will have a new FLAG_VIRTUAL_HARD_KEY bit set to identify them. Regardless of that flag, in nearly all cases an application can handle these "hard" key events in the same way it has always done for real hard keys.
However, these keys introduce some wrinkles in user interaction. Most important is that the keys exist on the same surface as the rest of the user interface, and they can be easily pressed with the same kind of touches. This can become an issue, for example, when the virtual keys are along the bottom of the screen: a common gesture is to swipe up the screen for scrolling, and it can be very easy to accidentally touch a virtual key at the bottom when doing this.
The solution for this in 2.0 is to introduce a concept of a "canceled" key event. We've already seen this in the previous story, where handling a long press would cancel the following up event. In a similar way, moving from a virtual key press on to the screen will cause the virtual key to be canceled when it goes up.
In fact the previous code already takes care of this — by checking isCanceled()
on the key up, canceled virtual keys and long presses will be ignored. There are also individual flags for these two cases, but they should rarely be used by applications and always with the understanding that in the future there may be more reasons for a key event to be canceled.
For existing application, where BACK key compatibility is turned on to execute the action on down, there is still the problem of accidentally detecting a back press when intending to perform a swipe. Though there is no solution for this except to update an application to specify it targets SDK version 5 or later, fortunately the back key is generally positioned on a far side of the virtual key area, so the user is much less likely to accidentally hit it than some of the other keys.
Writing an application that works well on pre-2.0 as well as 2.0 and later versions of the platform is also fairly easy for most common cases. For example, here is code that allows you to handle the back key in an activity correctly on all versions of the platform:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
&& keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
// Take care of calling this method on earlier versions of
// the platform where it doesn't exist.
onBackPressed();
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
// This will be called either automatically for you on 2.0
// or later, or by the code above on earlier versions of the
// platform.
return;
}
For the hard core: correctly dispatching events
One final topic that is worth covering is how to correctly handle events in the raw dispatch functions such as onDispatchEvent()
or onPreIme()
. These require a little more care, since you can't rely on some of the help the framework provides when it calls the higher-level functions such as onKeyDown()
. The code below shows how you can intercept the dispatching of the BACK
key such that you correctly execute your action when it is release.
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0) {
// Tell the framework to start tracking this event.
getKeyDispatcherState().startTracking(event, this);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
getKeyDispatcherState().handleUpEvent(event);
if (event.isTracking() && !event.isCanceled()) {
// DO BACK ACTION HERE
return true;
}
}
return super.dispatchKeyEvent(event);
} else {
return super.dispatchKeyEvent(event);
}
}
The call to getKeyDispatcherState()
returns an object that is used to track the current key state in your window. It is generally available on the View class, and an Activity can use any of its views to retrieve the object if needed.
Thursday, December 17, 2009
New resources and sample code on developer.android.com
Hey Android developers—if you've visited the online Android SDK documentation recently, you may have noticed a few changes. That's right, there's a new Resources tab, which was designed to take some of the load off the Developer's Guide. We've moved a number of existing resources to the Resources tab, including tutorials, sample code, and FAQs. We've also formalized a few of our most popular developer blog posts into technical articles; watch for more of these to appear in the future.
In addition, we just released a new batch of sample code, available now as a ZIP file download on the samples index page. And we're working on updating the way in which we distribute official sample code; more on that some other time.
The new sample code includes:
Multiple Resolutions: a simple example showing how to use resource directory qualifiers to support multiple screen configurations and Android SDK versions.
Wiktionary and WiktionarySimple: sample applications that illustrate how to create an interactive home screen widget.
Contact Manager: an example on using the new ContactsContract interface to query and manipulate a user's various accounts and contact providers.
Bluetooth Chat: a fun little demo that allows two users to have a 1 on 1 chat over Bluetooth. It demonstrates how to discover devices, initiate a connection, and transfer data.
API Demos > App > Activity > QuickContactsDemo: a demo showing how to use theandroid.widget.QuickContactsBadge
class, new in Android 2.0.
API Demos > App > Activity > SetWallpaper: a demo showing how to use the newandroid.app.WallpaperManager
class to allow users to change the system wallpaper.
API Demos > App > Text-To-Speech: a sample using Text-To-Speech (speech synthesis) to make your application talk.
NotePad (now with Live Folders): this sample now includes code for creating Live Folders.
We hope these new samples can be a valuable resource for learning some of the newer features in Android 1.6 and 2.0. Let us know in the android-developers Google Group if you have any questions about these new samples or about the new Resources tab.
Thanks for tuning in, and 'til next time, happy coding!
Knowing is half the battle
As a developer, I often wonder which Android platforms my applications should support,especially as the number of Android-powered devices grows. Should my application only focus on the latest version of the platform or should it support older ones as well?
To help with this kind of decision, I am excited to announce the new
device dashboard. It provides information about deployed Android-powered devices that is helpful to developers as they build and update their apps. The dashboard provides the relative distribution of Android platform versions on devices running Android Market.
|
The above graph shows the relative number of Android devices that have accessed Android Market during the first 14 days of December 2009.
From a developer's perspective, there are a number of interesting points on this graph:
- At this point, there's little incentive to make sure a new application is
backward compatible with Android 1.0 and Android 1.1. - Close to 30% of the devices are running Android 1.5. To take advantage of this significant install base, you may consider support for Android 1.5.
- Starting with Android 1.6, devices can have different screen densities & sizes. There are several devices out there that fall in this category, so make sure to adapt your application to support different screen sizes and take advantage of devices with small, low density (e.g QVGA) and normal, high density (e.g. WVGA) screens. Note that Android Market will not list your application on small screen devices unless its manifest explicitly indicates support for "small" screen sizes. Make sure you properly configure the emulator and test your application on different screen sizes before uploading to Market.
- A new SDK for Android 2.0.1 was released two weeks ago. All Android 2.0 devices will be updated to 2.0.1 before the end of the year, so if your application uses features specific to Android 2.0, you are encouraged to update it to take advantage of the latest Android 2.0.1 API instead.
In summary, Android 1.5, 1.6, and 2.0.1 are the 3 versions of the platform that are deployed in volume. Our goal is to provide you with the tools and information to make it easy for you to target specific versions of the platform or all the versions that are deployed in volume.
We plan to update the dashboard regularly to reflect deployment of new Android platforms. We also plan to expand the dashboard to include other information like devices per screen size and so on.
Kasus Twitter Luna Maya
"Infotemnt derajatnya lebh HINA dr pd PELACUR, PEMBUNUH!!!! may ur soul burn in hell!!..." begitu tulis pemilik akun @lunmay itu.Tak ayal, komentar Luna Maya menyulut tanggapan keras. Bambangelf, salah satu follower Twitter Luna Maya, langsung menanggapinya. "Bahasa lu makin norak, bodoh ga terpelajar dan ga mikir panjang...," tulis Bambangelf menanggapi komentar Luna.Tak terima dengan komentar tersebut, Luna langsung "menyerang" dengan kata-kata garang. "bambangelf: apa urusan lu ama bahasa gw!!!? Kenal aja gak gw ama lo. knp lo ribet ngurusin gw??...."Membaca reaksi Luna, Bambang yang bekerja di salah satu media televisi swasta itu malah menertawakan Luna. "hahahahaha... lu makin kelihatan t**l ;)"Bambang yang dihubungi Kompas.com melalui telepon genggamnya, Rabu (16/12/2009), membenarkan hal itu. Ia hanya menyesalkan ucapan Luna yang terkesan kasar di public domain. Sebagai public figure, Luna seharusnya bisa menjaga citra dirinya. "Dia lupa kalau dia itu dibesarkan oleh media," katanya.Tak mau ucapannya jadi blunder, Luna sepertinya memilih aman. Ia langsung menghapus akun Lunmay di situs jejaring sosial itu, menyusul mulai ramainya reaksi atas ucapannya itu. Saat ini jumlah follower Luna Maya mencapai 123.719.Hingga saat ini, belum diperoleh keterangan dari Luna mengenai komentar yang ditulis di akun Twitter miliknya itu.Sebelum Tutup Akun Twitternya, Luna Maya Sempat Minta MaafSeakan menyesali ulahnya di situs jejaring Twitter, presenter yang juga model, Luna Maya, langsung meminta maaf melalui status yang di-update-nya pula di Twitter, hingga akhirnya kekasih Ariel "Peterpan" itu menonaktifkan akunnya."Maaf yaa semua untuk twit yg gak penting itu, tp untuk yg mengerti makasih bgt, tp untuk yg gak ngerti jg maaf...," tulis Luna di akun Twitter miliknya, Rabu (16/12/2009).
Friday, December 11, 2009
Come to Our Virtual Office Hours
Starting this week, we're going to be holding regular IRC office hours for Android app developers in the #android-dev channel on irc.freenode.net. Members of the Android team will be on hand to answer your technical questions. (Note that we will not be able to provide customer support for the phones themselves.)
We've arranged our office hours to accommodate as many different schedules as possible, for folks around the world. We will initially hold two sessions each week:
- 12/15/09 Tuesday, 9 a.m. to 10 a.m. PST
- 12/17/09, Thursday 5 p.m. to 6 p.m. PST
- 12/22/09, Tuesday 9 a.m. to 10 a.m. PST
- 01/06/10 Wednesday 9 a.m. to 10 a.m. PST
- 01/07/10 Thursday 5 p.m. to 6 p.m. PST
Check Wikipedia for a helpful list of IRC clients. Alternatively, you could use a web interface such as the one at freenode.net. We will try to answer as many as we can get through in the hour.
We hope to see you there!
Thursday, December 10, 2009
Optimize your layouts
/* Stylesheet generated from TextMate theme
*
* Mac Classic
*
*
*//* Mostly to improve view within the TextMate HTML viewer */
body {
margin: 0;
padding: 0;
}pre.textmate-source {
margin: 0;
padding: 0 0 0 2px;
font-family: Monaco, monospace;
font-size: 11px;
line-height: 1.3em;
word-wrap: break-word;
white-space: pre;
white-space: pre-wrap;
white-space: -moz-pre-wrap;
white-space: -o-pre-wrap;
}pre.textmate-source.mac_classic {
color: #000000;
background-color: #FFFFFF;
}pre.textmate-source .linenum {
width: 75px;
padding: 0.1em 1em 0.2em 0;
color: #888;
background-color: #eee;
}
pre.textmate-source.mac_classic span {
padding-top: 0.2em;
padding-bottom: 0.1em;
}
pre.textmate-source.mac_classic ::selection {
background-color: rgba(77, 151, 255, 0.33);
}
/* Comment */
pre.textmate-source.mac_classic .comment {
color: #0066FF;
font-style: italic;
}/* Keyword */
pre.textmate-source.mac_classic .keyword, pre.textmate-source.mac_classic .storage {
color: #0000FF;
font-weight: bold;
}/* Number */
pre.textmate-source.mac_classic .constant_numeric {
color: #0000CD;
}/* User-defined constant */
pre.textmate-source.mac_classic .constant {
color: #C5060B;
font-weight: bold;
}/* Built-in constant */
pre.textmate-source.mac_classic .constant_language {
color: #585CF6;
font-weight: bold;
}/* Variable */
pre.textmate-source.mac_classic .variable_language, pre.textmate-source.mac_classic .variable_other {
color: #318495;
}/* String */
pre.textmate-source.mac_classic .string {
color: #036A07;
}/* String interpolation */
pre.textmate-source.mac_classic .constant_character_escape, pre.textmate-source.mac_classic .string .source {
color: #26B31A;
}/* Preprocessor line */
pre.textmate-source.mac_classic .meta_preprocessor {
color: #1A921C;
}/* Preprocessor directive */
pre.textmate-source.mac_classic .keyword_control_import {
color: #0C450D;
font-weight: bold;
}/* Function name */
pre.textmate-source.mac_classic .entity_name_function, pre.textmate-source.mac_classic .support_function_any-method {
color: #0000A2;
font-weight: bold;
}/* Type name */
pre.textmate-source.mac_classic .entity_name_type {
text-decoration: underline;
}/* Inherited class name */
pre.textmate-source.mac_classic .entity_other_inherited-class {
font-style: italic;
}/* Function parameter */
pre.textmate-source.mac_classic .variable_parameter {
font-style: italic;
}/* Function argument and result types */
pre.textmate-source.mac_classic .storage_type_method {
color: #70727E;
}/* Section */
pre.textmate-source.mac_classic .meta_section .entity_name_section, pre.textmate-source.mac_classic .declaration_section .entity_name_section {
font-style: italic;
}/* Library function */
pre.textmate-source.mac_classic .support_function {
color: #3C4C72;
font-weight: bold;
}/* Library object */
pre.textmate-source.mac_classic .support_class, pre.textmate-source.mac_classic .support_type {
color: #6D79DE;
font-weight: bold;
}/* Library constant */
pre.textmate-source.mac_classic .support_constant {
color: #06960E;
font-weight: bold;
}/* Library variable */
pre.textmate-source.mac_classic .support_variable {
color: #21439C;
font-weight: bold;
}/* JS: Operator */
pre.textmate-source.mac_classic .keyword_operator_js {
color: #687687;
}/* Invalid */
pre.textmate-source.mac_classic .invalid {
color: #FFFFFF;
background-color: #990000;
}/* Invalid trailing whitespace */
pre.textmate-source.mac_classic .invalid_deprecated_trailing-whitespace {
background-color: #FFD0D0;
}/* Embedded source */
pre.textmate-source.mac_classic .text .source, pre.textmate-source.mac_classic .string_unquoted {
background-color: rgba(0, 0, 0, 0.05);
}/* Embedded embedded source */
pre.textmate-source.mac_classic .text .source .string_unquoted, pre.textmate-source.mac_classic .text .source .text .source {
background-color: rgba(0, 0, 0, 0.06);
}/* Markup XML declaration */
pre.textmate-source.mac_classic .meta_tag_preprocessor_xml {
color: #68685B;
}/* Markup DOCTYPE */
pre.textmate-source.mac_classic .meta_tag_sgml_doctype, pre.textmate-source.mac_classic .meta_tag_sgml_doctype .entity, pre.textmate-source.mac_classic .meta_tag_sgml_doctype .string, pre.textmate-source.mac_classic .meta_tag_preprocessor_xml, pre.textmate-source.mac_classic .meta_tag_preprocessor_xml .entity, pre.textmate-source.mac_classic .meta_tag_preprocessor_xml .string {
color: #888888;
}/* Markup DTD */
pre.textmate-source.mac_classic .string_quoted_docinfo_doctype_DTD {
font-style: italic;
}/* Markup tag */
pre.textmate-source.mac_classic .meta_tag, pre.textmate-source.mac_classic .declaration_tag {
color: #1C02FF;
}/* Markup name of tag */
pre.textmate-source.mac_classic .entity_name_tag {
font-weight: bold;
}/* Markup tag attribute */
pre.textmate-source.mac_classic .entity_other_attribute-name {
font-style: italic;
}/* Markup: Heading */
pre.textmate-source.mac_classic .markup_heading {
color: #0C07FF;
font-weight: bold;
}/* Markup: Quote */
pre.textmate-source.mac_classic .markup_quote {
color: #000000;
font-style: italic;
}/* Markup: List */
pre.textmate-source.mac_classic .markup_list {
color: #B90690;
}
</style>Writing user interface layouts for Android applications is easy, but it can sometimes be difficult to optimize them. Most often, heavy modifications made to existing XML layouts, like shuffling views around or changing the type of a container, lead to inefficiencies that go unnoticed.
$ layoutopt samples/
samples/compound.xml
7:23 The root-level <FrameLayout/> can be replaced with <merge/>
11:21 This LinearLayout layout or its FrameLayout parent is useless samples/simple.xml
7:7 The root-level <FrameLayout/> can be replaced with <merge/>
samples/too_deep.xml
-1:-1 This layout has too many nested layouts: 13 levels, it should have <= 10!
20:81 This LinearLayout layout or its LinearLayout parent is useless
24:79 This LinearLayout layout or its LinearLayout parent is useless
28:77 This LinearLayout layout or its LinearLayout parent is useless
32:75 This LinearLayout layout or its LinearLayout parent is useless
36:73 This LinearLayout layout or its LinearLayout parent is useless
40:71 This LinearLayout layout or its LinearLayout parent is useless
44:69 This LinearLayout layout or its LinearLayout parent is useless
48:67 This LinearLayout layout or its LinearLayout parent is useless
52:65 This LinearLayout layout or its LinearLayout parent is useless
56:63 This LinearLayout layout or its LinearLayout parent is useless
samples/too_many.xml
7:413 The root-level <FrameLayout/> can be replaced with <merge/>
-1:-1 This layout has too many views: 81 views, it should have <= 80! samples/useless.xml
7:19 The root-level <FrameLayout/> can be replaced with <merge/>
11:17 This LinearLayout layout or its FrameLayout parent is useless
Windows users: to start layoutopt, open the file called
layoutopt.bat
in the tools directory of the SDK and on the last line, replace %jarpath%
with -jar %jarpath%
.A Frugal Lifestyle
Thursday, December 3, 2009
Android SDK Updates
Today we are releasing updates to multiple components of the Android SDK:
- Android 2.0.1, revision 1
- Android 1.6, revision 2
- SDK Tools, revision 4
Android 2.0.1 is a minor update to Android 2.0. This update includes several bug fixes and behavior changes, such as application resource selection based on API level and changes to the value of some Bluetooth-related constants. For more detailed information, please see the Android 2.0.1 release notes.
To differentiate its behavior from Android 2.0, the API level of Android 2.0.1 is 6. All Android 2.0 devices will be updated to 2.0.1 before the end of the year, so developers will no longer need to support Android 2.0 at that time. Of course, developers of applications affected by the behavior changes should start compiling and testing their apps immediately.
We are also providing an update to the Android 1.6 SDK component. Revision 2 includes fixes to the compatibility mode for applications that don't support multiple screen sizes, as well as SDK fixes. Please see the Android 1.6, revision 2 release notes for the full list of changes.
Finally, we are also releasing an update to the SDK Tools, now in revision 4. This is a minor update with mostly bug fixes in the SDK Manager. A new version of the Eclipse plug-in that embeds those fixes is also available. For complete details, please see the SDK Tools, revision 4 and ADT 0.9.5 release notes.
One more thing: you can now follow us on twitter @AndroidDev.