131 lines
4.8 KiB
Plaintext
131 lines
4.8 KiB
Plaintext
|
page.title=UI Framework Changes in Android 1.6
|
||
|
@jd:body
|
||
|
|
||
|
<p>Android 1.6 introduces numerous enhancements and bug fixes in the UI
|
||
|
framework. This article highlights two improvements in particular: more flexible
|
||
|
and robust RelativeLayout and easier click listeners. </p>
|
||
|
|
||
|
<h3>More flexible, more robust RelativeLayout</h3>
|
||
|
|
||
|
<p>RelativeLayout is the most versatile layout offered by the Android UI toolkit
|
||
|
and can be successfully used to reduce the number of views created by your
|
||
|
applications. This layout used to suffer from various bugs and limitations,
|
||
|
sometimes making it difficult to use without having some knowledge of its
|
||
|
implementation. To make your life easier, Android 1.6 comes with a revamped
|
||
|
RelativeLayout. </p>
|
||
|
|
||
|
<p>This new implementation not only fixes all known bugs in
|
||
|
RelativeLayout but also addresses its major limitation: the
|
||
|
fact that views had to be declared in a particular order. Consider the following
|
||
|
XML layout:</p>
|
||
|
|
||
|
<pre><?xml version="1.0" encoding="utf-8"?>
|
||
|
|
||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||
|
android:layout_width="fill_parent"
|
||
|
android:layout_height="64dip"
|
||
|
android:padding="6dip">
|
||
|
|
||
|
<TextView
|
||
|
android:id="@+id/band"
|
||
|
android:layout_width="fill_parent"
|
||
|
android:layout_height="26dip"
|
||
|
|
||
|
android:layout_below="@+id/track"
|
||
|
android:layout_alignLeft="@id/track"
|
||
|
android:layout_alignParentBottom="true"
|
||
|
|
||
|
android:gravity="top"
|
||
|
android:text="The Airborne Toxic Event" />
|
||
|
|
||
|
<TextView
|
||
|
android:id="@id/track"
|
||
|
android:layout_marginLeft="6dip"
|
||
|
android:layout_width="fill_parent"
|
||
|
android:layout_height="26dip"
|
||
|
|
||
|
android:layout_toRightOf="@+id/artwork"
|
||
|
|
||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||
|
android:gravity="bottom"
|
||
|
android:text="Sometime Around Midnight" />
|
||
|
|
||
|
<ImageView
|
||
|
android:id="@id/artwork"
|
||
|
android:layout_width="56dip"
|
||
|
android:layout_height="56dip"
|
||
|
android:layout_gravity="center_vertical"
|
||
|
|
||
|
android:src="@drawable/artwork" />
|
||
|
|
||
|
</RelativeLayout></pre>
|
||
|
|
||
|
<p>This code builds a very simple layout—an image on the left with two lines of
|
||
|
text stacked vertically. This XML layout is perfectly fine and contains no
|
||
|
errors. Unfortunately, Android 1.5's RelativeLayout is incapable of rendering it
|
||
|
correctly, as shown in the screenshot below.</p>
|
||
|
|
||
|
<img src="images/ui-1.6_002.png" style="width: 320px; height: 480px;">
|
||
|
|
||
|
<p>The problem is that this layout uses forward references. For instance, the
|
||
|
"band" TextView is positioned below the "track" TextView but "track" is declared
|
||
|
after "band" and, in Android 1.5, RelativeLayout does not know how to handle
|
||
|
this case. Now look at the exact same layout running on Android 1.6:</p>
|
||
|
|
||
|
<img src="images/ui-1.6.png" style="width: 320px; height: 480px;">
|
||
|
|
||
|
<p>As you can see Android 1.6 is now better able to handle forward reference.
|
||
|
The result on screen is exactly what you would expect when writing the
|
||
|
layout.</p>
|
||
|
|
||
|
<h3>Easier click listeners</h3>
|
||
|
|
||
|
<p>Setting up a click listener on a button is very common task, but
|
||
|
it requires quite a bit of boilerplate code:</p>
|
||
|
|
||
|
<pre>findViewById(R.id.myButton).setOnClickListener(new View.OnClickListener() {
|
||
|
public void onClick(View v) {
|
||
|
// Do stuff
|
||
|
}
|
||
|
});</pre>
|
||
|
|
||
|
<p>One way to reduce the amount of boilerplate is to share a single click
|
||
|
listener between several buttons. While this technique reduces the
|
||
|
number of classes, it still requires a fair amount of code and it still
|
||
|
requires giving each button an id in your XML layout file:</p>
|
||
|
|
||
|
<pre>View.OnClickListener handler = View.OnClickListener() {
|
||
|
public void onClick(View v) {
|
||
|
switch (v.getId()) {
|
||
|
case R.id.myButton: // doStuff
|
||
|
break;
|
||
|
case R.id.myOtherButton: // doStuff
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
findViewById(R.id.myButton).setOnClickListener(handler);
|
||
|
findViewById(R.id.myOtherButton).setOnClickListener(handler);</pre>
|
||
|
|
||
|
<p>With Android 1.6, none of this is necessary. All you have to do is
|
||
|
declare a public method in your Activity to handle the click
|
||
|
(the method <i>must</i> have one View argument):</p>
|
||
|
|
||
|
<pre>class MyActivity extends Activity {
|
||
|
public void myClickHandler(View target) {
|
||
|
// Do stuff
|
||
|
}
|
||
|
}</pre>
|
||
|
|
||
|
<p>And then reference this method from your XML layout:</p>
|
||
|
|
||
|
<pre><Button android:onClick="myClickHandler" /></pre>
|
||
|
|
||
|
<p>This new feature reduces both the amount of Java and XML you have to write,
|
||
|
leaving you more time to concentrate on your application.</p>
|
||
|
|
||
|
<p>The Android team is committed to helping you write applications in the
|
||
|
easiest and most efficient way possible. We hope you find these improvements
|
||
|
useful and we're excited to see your applications on Android Market.</p>
|