Android basics - Applying some UI patterns
When I started with my Android application, I had the idea to create a home screen and an action bar just like one of the Android developers described in a blog item. I was really helped by the source code of the Google I/O Schedule app. In this post I will explain how I used several layouts to create my app.
Action bar
The action bar is a bar on the top of the screen that provides your users with quick access to common actions. In the screenshot I placed an icon in the right corner that lets the user quickly return to the home screen.
The XML layout:
<
LinearLayout
style
=
"@style/TitleBar"
>
<
ImageView
style
=
"@style/TitleBarAction"
android:src
=
"@drawable/title_bar_logo"
/>
<
ImageView
style
=
"@style/TitleBarSeparator"
/>
<
TextView
style
=
"@style/TitleBarText"
android:text
=
"JTeam"
/>
<
ImageView
style
=
"@style/TitleBarSeparator"
/>
<
ImageButton
style
=
"@style/TitleBarAction"
android:src
=
"@drawable/ic_title_home_default"
android:onClick
=
"onHomeClick"
/>
</
LinearLayout
>
The XML file for the style (styles.xml):
<
style
name
=
"TitleBar"
>
<
item
name
=
"android:id"
>@+id/title_container</
item
>
<
item
name
=
"android:layout_width"
>fill_parent</
item
>
<
item
name
=
"android:layout_height"
>45dip</
item
>
<
item
name
=
"android:orientation"
>horizontal</
item
>
<
item
name
=
"android:background"
>#4b08a3</
item
>
</
style
>
<
style
name
=
"TitleBarAction"
>
<
item
name
=
"android:layout_width"
>45dip</
item
>
<
item
name
=
"android:layout_height"
>fill_parent</
item
>
<
item
name
=
"android:background"
>@drawable/title_button</
item
>
</
style
>
<
style
name
=
"TitleBarSeparator"
>
<
item
name
=
"android:layout_width"
>1px</
item
>
<
item
name
=
"android:layout_height"
>fill_parent</
item
>
<
item
name
=
"android:background"
>#40ffffff</
item
>
</
style
>
<
style
name
=
"TitleBarText"
>
<
item
name
=
"android:layout_width"
>0dp</
item
>
<
item
name
=
"android:layout_height"
>fill_parent</
item
>
<
item
name
=
"android:layout_weight"
>1</
item
>
<
item
name
=
"android:gravity"
>center_vertical</
item
>
<
item
name
=
"android:textSize"
>18sp</
item
>
<
item
name
=
"android:paddingLeft"
>12dip</
item
>
<
item
name
=
"android:paddingRight"
>12dip</
item
>
<
item
name
=
"android:textStyle"
>bold</
item
>
<
item
name
=
"android:textColor"
>#ffffffff</
item
>
<
item
name
=
"android:singleLine"
>true</
item
>
<
item
name
=
"android:ellipsize"
>end</
item
>
</
style
>
In your activity you need to implement the onClick of the home button.
public
void
onHomeClick(View v) {
startActivity(
new
Intent(
this
, HomeActivity.
class
));
}
Dashboard
The dashboard is often your home orientation activity and contains the main features of your application. To create a dashboard you need to create a layout file and program the behaviour of the buttons when they are clicked.
On the left you can see the dashboard that I created. I have copied the icons just to give you an impression of how a “full” dashboard could look like.
The XML layout (main.xml):
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:id
=
"@+id/home_root"
android:orientation
=
"vertical"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
android:background
=
"#ffffffff"
>
<!-- Actionbar -->
<
LinearLayout
style
=
"@style/TitleBar"
>
...
</
LinearLayout
>
<!-- Buttons -->
<
LinearLayout
android:orientation
=
"vertical"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:layout_weight
=
"1"
android:padding
=
"6dip"
>
<
LinearLayout
android:orientation
=
"horizontal"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:layout_weight
=
"1"
>
<
Button
android:id
=
"@+id/home_btn_users"
style
=
"@style/HomeButton"
android:onClick
=
"onEmployeesClick"
android:text
=
"Employees"
android:drawableTop
=
"@drawable/btn_employees"
/>
<
Button
android:id
=
"@+id/home_btn_player_availability"
style
=
"@style/HomeButton"
android:onClick
=
"onCalendarClick"
android:text
=
"Calendar"
android:drawableTop
=
"@drawable/btn_calendar"
/>
</
LinearLayout
>
...
</
LinearLayout
>
</
LinearLayout
>
The activity (HomeActivity.java):
public
class
HomeActivity
extends
Activity {
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public
void
onEmployeesClick(View v) {
startActivity(
new
Intent(
this
, EmployeesActivity.
class
));
}
}
ProcessDialog
The ProcessDialog allows you to load data in the background while you show your users a loading screen. The ProcessDialog can be realised with an AsyncTask.
I created a subclass of the AsyncTask that overrides three methods.
- doInBackground(…) - In this method you can make the call to get your data.
- onPreExecute() - In this method you can show your dialog.
- onPostExecute() - This method will be executed when all data is retrieved. Here you can dismiss your dialog and add the data to your adapter.
The XML layout (activity_employees.xml):
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:orientation
=
"vertical"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
>
<!-- Actionbar -->
<
LinearLayout
style
=
"@style/TitleBar"
>
...
</
LinearLayout
>
<
ListView
android:id
=
"@android:id/list"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
/>
</
LinearLayout
>
The activity (EmployeesActivity.java):
public
class
EmployeesActivity
extends
ListActivity {
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_employees);
new
EmployeesTask().execute();
}
public
void
onHomeClick(View v) {
startActivity(
new
Intent(
this
, HomeActivity.
class
));
}
//================================================= EmployeesTask ==================================================
private
class
EmployeesTask
extends
AsyncTask<Void, Void, String[]> {
private
ProgressDialog progressDialog;
@Override
protected
String[] doInBackground(Void... voids) {
return
new
String[]{
"Roberto van der Linden"
,
"Employee 2"
,
"Employee 3"
};
}
@Override
protected
void
onPreExecute() {
progressDialog = ProgressDialog.show(EmployeesActivity.
this
,
""
,
"Loading..."
);
}
@Override
protected
void
onPostExecute(String[] employees) {
progressDialog.dismiss();
setListAdapter(
new
ArrayAdapter<String>(EmployeesActivity.
this
, android.R.layout.simple_list_item_1, employees));
}
}
}
So I hope this blog helped a few of people in their journey to create a great Android app. If you want to know more about creating an app with asynchronous retrieval of data, you can read my previous blog post.