Android Chapter04 User Interfaces
Android Chapter04 User Interfaces
Graphical User Interfaces interface, (2) business, and (3) input logic.
How is this pattern seen by the Android developer?
• Model. Consists of the Java code and API objects used to represent the
Victor Matos business problem and manage the behavior and data of the application.
Cleveland State University • View. Set of screens the user sees and interacts with.
• Controller. Implemented through the Android OS, responsible for
interpretation of the user and system inputs. Input may come from a
variety of sources such as the trackball, keyboard, touch-screen, GPS
chip, proximity sensor, accelerometer, etc, and tells the Model and/or the
View (usually through callbacks and registered listeners) to change as
Portions of this page are reproduced from work created and shared by Google and used according to terms appropriate.
described in the Creative Commons 3.0 Attribution License.
4-2
1. Set properties: For instance, when working with a TextView you set
the background color, text, font, alignment, size, padding, margin,
etc.
3. Set focus: To set focus on a specific view, you call the method
.requestFocus() or use XML tag <requestFocus />
GalleryView
TabWidget
MapView
Spinner
AutoCompleteTextView ListView
TimePicker Form Controls It is a version of the EditText A ListView is a View that
Includes a variety of typical widget that will provide shows items in a vertically
AnalogClock
form widgets, like: auto-complete suggestions scrolling list. The items are
DatePicker as the user types. The acquired from a ListAdapter.
A DatePicke is a widget image buttons,
text fields, suggestions are extracted
that allows the user to from a collection of strings.
select a month, day and checkboxes and
year. radio buttons.
Reference: http://developer.android.com/guide/topics/ui/layout-objects.html
Reference: http://developer.android.com/guide/topics/ui/layout-objects.html 4 - 11 4 - 12
Android - Graphical User Interfaces Android - Graphical User Interfaces
GUI Editing: XML Version GUI Editing: XML Version
Android considers XML-based layouts to be resources, consequently layout files Android considers XML-based layouts to be resources, consequently layout files
are stored in the res/layout directory inside your Android project. are stored in the res/layout directory inside your Android project.
Package App
Explorer explorer
Resource
folder
Resource
folder
4 - 13 4 - 14
Widget’s
• DroidDraw Very simple GUI designer, incomplete, not integrated to the
properties Eclipse IDE, aging! http://www.droiddraw.org/
4 - 17 4 - 18
• If the layout has a vertical orientation new rows are placed one on top of Configuring a LinearLayout usually requires you to set the following attributes:
the other.
• orientation (vertical, horizontal)
• A horizontal layout uses a side-by-side column placement policy. • fill model (match_parent, wrap_contents)
• weight (0, 1, 2, …n )
• gravity (top, bottom, center,…)
• padding ( dp – dev. independent pixels )
• margin ( dp – dev. independent pixels )
4 - 19 4 - 20
Android - Graphical User Interfaces Android - Graphical User Interfaces
LinearLayout : Orientation <LinearLayout
xmlns:android="http://schemas.android.com/ap
LinearLayout : Fill Model
k/res/android"
The android:orientation property android:id="@+id/myLinearLayout" • Widgets have a "natural size“ based on their included text (rubber band
can be set to: horizontal for columns, or android:layout_width="match_parent" effect).
android:layout_height="match_parent"
vertical for rows. android:orientation="horizontal" • On occasions you may want your widget to have a specific space
android:padding="4dp" >
Use setOrientation() for runtime allocation (height, width) even if no text is initially provided (as is the
<TextView
changes. android:id="@+id/labelUserName" case of the empty text box shown below).
horizontal android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ffff0000" natural sizes
android:text=" User Name " empty screen space
android:textColor="#ffffffff"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/ediName"
v android:layout_width="wrap_content"
e android:layout_height="wrap_content"
r android:text="Maria Macarena" Shown on a
t android:textSize="18sp" /> Gingerbread
i <Button device
c android:id="@+id/btnGo"
a android:layout_width="wrap_content"
l android:layout_height="wrap_content"
android:text="Go"
android:textStyle="bold" />
Shown on a Kitkat device </LinearLayout>
421
- 21 4 - 22
<TextView
android:id="@+id/labelUserName"
android:layout_width="match_parent" Use all the row
Values used in defining height and width can be: android:layout_height="wrap_content"
android:background="#ffff0066"
1. A specific dimension such as 125dp (device independent pixels dip ) android:text="User Name"
android:textColor="#ff000000"
android:textSize="16sp"
android:textStyle="bold" />
2. wrap_content indicates the widget should just fill up its natural space.
<EditText
android:id="@+id/ediName"
android:layout_width="match_parent"
3. match_parent (previously called ‘fill_parent’) indicates the widget wants android:layout_height="wrap_content"
android:textSize="18sp" />
to be as big as the enclosing parent.
<Button
android:id="@+id/btnGo" Specific size: 125dp
android:layout_width="125dp"
Medium resolution is: 320 x 480 dpi. android:layout_height="wrap_content"
Shown on a Gingerbread device android:text="Go"
android:textStyle="bold" />
4 - 23 </LinearLayout> 4 - 24
Android - Graphical User Interfaces Android - Graphical User Interfaces
Warning ! Same XML different rendition… LinearLayout : Weight
Since the introduction of Android The extra space left unclaimed in a layout could be assigned to
4.x, changes in the SDK make any of its inner components by setting its Weight attribute.
layouts to be more uniformly Use 0 if the view should not be stretched. The bigger the weight
displayed in all 4.x and newer the larger the extra space given to that widget.
devices (the intention is to provide
a seamless Android experience Example
The XML specification for this window is
independent from provider,
similar to the previous example.
hardware, and developer).
Kitkat
The TextView and Button controls have
The XML spec used in the previous the additional property
example looks different when Takes: 2 /(1+1+2)
displayed on a 4.x and older android:layout_weight="1" of the screen space
devices (see figures on the right, Same XML layout shown on a
please also notice the color whereas the EditText control has
Gingerbread (left) and Kitkat (right) device.
bleeding occurring on top of the
android:layout_weight="2"
GO button, more on this issue in
the Appendix) Remember, default value is 0
4 - 25 Gingerbread 4 - 26
• Either use
• android:padding property
Button has
• or call method setPadding() at runtime.
right
layout_gravity
The ‘blue’ surrounding space
Hello world around the text represents
the inner view’s padding
4 - 27 4 - 29
Android - Graphical User Interfaces Android - Graphical User Interfaces
LinearLayout : Padding and Margin LinearLayout : Set Internal Margins Using Padding
Padding and Margin represent the internal and external spacing between a Example:
widget and its included and surrounding context (respectively). The EditText box has been changed to include 30dp of padding all around
<EditText
android:id="@+id/ediName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:padding="30dp" />
...
4 - 30 4 - 31
android:layout_alignParentTop
android:layout_alignParentBottom
android:layout_alignParentLeft
android:layout_alignParentRight
android:layout_centerInParent
android:layout_centerVertical
android:layout_centerHorizontal
4 - 34 4 - 35
wid1 <Button
android:layout_alignLeft=“@+id/wid1” android:id="@+id/wid2"
wid2 android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/wid1"
wid1 android:layout_alignRight="@+id/wid1"
android:layout_alignRight=“@+id/wid1” android:layout_marginBottom="36dp"
wid2 android:text="@string/wid2" />
4 - 36 4 - 37
Android - Graphical User Interfaces Android - Graphical User Interfaces
Relative Layout - Referring to Other Widgets – WYSIWYG Editor Relative Layout - Example2
<RelativeLayout
When using relative positioning you need to: xmlns:android="http://schemas.android.com/apk/r <EditText
es/android" android:id="@+id/txtUserName"
android:id="@+id/myRelativeLayout" android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="wrap_content"
1. Use identifiers ( android:id attributes ) on all elements that you will android:layout_height="match_parent" android:layout_alignParentLeft="true"
be referring to. android:background="#ff000099" > android:layout_below="@+id/lblUserName"
android:padding="20dp" >
<TextView </EditText>
android:id="@+id/lblUserName"
2. XML elements are named using the prefix: @+id/... For instance android:layout_width="match_parent" <Button
android:layout_height="wrap_content" android:id="@+id/btnGo"
an EditText box could be called: android:id="@+id/txtUserName" android:layout_alignParentLeft="true" android:layout_width="wrap_content"
android:layout_alignParentTop="true" android:layout_height="wrap_content"
android:background="#ffff0066"
3. You must refer only to widgets that have been already defined. For android:text="User Name" android:layout_alignRight="@+id/txtUserName"
android:textColor="#ff000000" android:layout_below="@+id/txtUserName"
instance a new control to be positioned below the txtUserName EditText android:textStyle="bold" > android:text="Go"
</TextView> android:textStyle="bold" >
box could refer to it using: </Button>
android:layout_below="@+id/txtUserName" <Button
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txtUserName"
android:layout_toLeftOf="@+id/btnGo"
android:text="Cancel"
android:textStyle="bold" >
</Button>
4 - 38 </RelativeLayout> 439
- 39
0 1
0 1 2
0 1 2 3
4 - 40 4 - 41
Android - Graphical User Interfaces Android - Graphical User Interfaces
Table Layout – Example 3 Table Layout – Example 3 continuation
<TableLayout
<TableRow>
The screen shows various items from xmlns:android="http://schemas.android.com/apk/r
a McDonald’s restaurant menu [*]. es/android" <TextView
android:id="@+id/myTableLayout" android:text="Big Mac" />
android:layout_width="match_parent" <TextView
The TableLayout has four TableRows, android:layout_height="match_parent" android:gravity="center"
android:orientation="vertical" android:text="530" />
with three columns in the first row android:padding="6dp" > <TextView
(labels) and four cells in each of the android:gravity="center"
<TableRow> android:text="3.99" />
other three rows (item, Calories, <TextView <Button
Price, and Buy button). android:background="#FF33B5E5" android:id="@+id/btnBuyBigMac"
android:text="Item " /> android:gravity="center"
<TextView android:text="Buy" />
android:layout_marginLeft="5dp" </TableRow>
android:background="#FF33B5E5"
android:text="Calories " /> <View
android:layout_height="1dp"
<TextView android:background="#FF33B5E5" />
android:layout_marginLeft="5dp"
android:background="#FF33B5E5" <!-- other TableRows ommitted --!>
android:text="Price $ " />
</TableRow>
</TableLayout>
<View
[*] Reference: Pages visited on Sept 8, 2014 android:layout_height="1dp"
http://nutrition.mcdonalds.com/getnutrition/nutritionfacts.pdf android:background="#FF33B5E5" />
http://hackthemenu.com/mcdonalds/menu-prices/ 4 - 42 4 - 43
4 - 44 android:layout_column="2" 4 - 45
Android - Graphical User Interfaces Android - Graphical User Interfaces
Table Layout – Example 4 continuation Table Layout – Stretching the Entire Table
• By default, a column is as wide as the “natural’ size of the widest widget
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
collocated in this column (e.g. a column holding a button showing the
xmlns:android="http://schemas.android.com/apk/res/android" caption “Go” is narrower than other column holding a button with the
android:id="@+id/myTableLayout"
android:layout_width="match_parent" caption “Cancel”).
android:layout_height="match_parent"
android:padding="6dp"
android:orientation="vertical" > • A table does not necessarily take all the horizontal space available.
<TableRow>
<TextView android:text="ISBN:" />
<EditText
android:id="@+id/ediISBN"
• If you want the table to (horizontally) match its container use the
Occupy 3
android:layout_span="3" /> property:
</TableRow> columns
<TableRow>
<Button
android:stretchColumns=“column(s)”
android:id="@+id/cancel"
android:layout_column="2"
android:text="Cancel" /> Where ‘column(s)’ is the column-index (or comma-separated column
<Button Skip
android:id="@+id/ok"
indices) to be stretched to take up any space still available on the row.
Note to the reader: android:text="OK" /> columns 0, 1 For example, to stretch columns 0, and 2 of a table you set
</TableRow>
Experiment changing android:stretchColumns=“0,2”
layout_span to 1, 2, 3 </TableLayout>
4 - 46 4 - 47
4 - 50 4 - 51
4 - 52 4 - 53
Android - Graphical User Interfaces Android - Graphical User Interfaces
Connecting Layouts to Java Code Connecting Layouts to Java Code
PLUMBING.
You must ‘connect’ functional XML elements –such as buttons, text boxes, Java code
package csu.matos.gui_demo;
check boxes- with their equivalent Java objects. This is typically done in the import android…;
onCreate(…) method of your main activity. After all the connections are
public class MainActivity extends Activity {
made and programmed, your app should be ready to interact with the user.
EditText edtUserName;
• When a widget is created, it is attached to a particular Context. By means Individual XML defined widgets, such as btnGo is later associated to the Java
of its affiliation to that environment, it then could access other members application using the statement findViewByID(...) as in
of the hierarchy on which it has been collocated.
Button btnGo= (Button) findViewById(R.id.btnGo);
• For a simple ‘one activity app’ -say MainActivity- the method
getApplicationContext() and the reference MainActivity.this return the Where R is a class automatically generated to keep track of resources
same result. available to the application. In particular R.id... is the collection of widgets
defined in the XML layout (Use Eclipse’s Package Explorer, look at your
• An application could have several activities. Therefore, for a multi- /gen/package/R.java contents).
activity app we have one app context, and a context for each of its
A Suggestion: The widget’s identifiers used in the XML layout and Java code could be the
activities, each good for accessing what is available in that context. same. It is convenient to add a prefix to each identifier indicating its nature. Some options are
txt, btn, edt, rad, chk, etc. Try to be consistent.
4 - 56 4 - 57
Android - Graphical User Interfaces Android - Graphical User Interfaces
Connecting Layouts to Java Code Basic Widgets: TextViews
Attaching Listeners to Widgets • In Android a label or text-box is called
a TextView.
Consider the screen on the right. To make its
‘Go’ button widget be responsive to the • A TextView is typically used for showing
user’s pushing of that button, we may add a a caption or a text message.
listener for the click event. • TextViews are not editable, therefore
they take no input.
Button btnGo = (Button) findViewById(R.id.btnGo);
• The text to be shown may include the
btnGo.setOnClickListener(new OnClickListener() { \n formatting character (newLine)
@Override
• You may also use HTML formatting by
public void onClick(View v) {
// get userName and validate against some database
setting the text to:
// put some more logic here... Html.fromHtml("<b>bold</b> string")
}
});
Note: Other common ‘listeners’ watch for events such as: textChanged, For a ‘colorful’ rendition of the ‘99 Bottles of Beer’
song see:
tap, long-press, select, focus, etc. 4 - 58 https://www.youtube.com/watch?v=3KnpZYkTWno
<TextView <Button
android:id="@+id/textView2" android:id="@+id/btnClickMeNow"
android:layout_width="match_parent" android:layout_width="120dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:layout_gravity="center"
android:background="@color/gray_light"
android:text="\n\t99 bottles of beer on the wall, 99 bottles of beer.Take one down and android:layout_marginTop="5dp“
pass it around, 98 bottles of beer on the wall.\n\n\t98 bottles of beer on the wall, 98 bottles android:gravity="center"
of beer.Take one down and pass it around, 97 bottles of beer on the wall. \n\n\t97 bottles of android:padding="5dp"
beer on the wall, 97 bottles of beer.Take one down and pass it around, 96 bottles of beer on android:text="Click Me Now!"
the wall... " android:textColor="#ffff0000"
android:textSize="14sp" />
android:textSize="20sp"
</LinearLayout> android:textStyle="bold" />
4 - 60 4 - 61
Android - Graphical User Interfaces Android - Graphical User Interfaces
Example9: Connecting Multiple Buttons This example shows an Example9: Connecting Multiple Buttons [Layout]
alternative way of
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
wiring-up multiple
public class MainActivity extends Activity implements OnClickListener { xmlns:tools="http://schemas.android.com/tools"
TextView txtMsg; buttons. Observe how android:layout_width="match_parent"
Button btnBegin; the main activity android:layout_height="match_parent"
Button btnExit; android:orientation="vertical"
implements the
@Override android:padding="6dp" >
public void onCreate(Bundle savedInstanceState) { OnClickListener
super.onCreate(savedInstanceState); interface. <TextView
setContentView(R.layout.activity_main ); android:id="@+id/txtMsg"
The mandatory onClick
android:layout_width="match_parent"
txtMsg = (TextView) findViewById(R.id.txtMsg); method checks which of android:layout_height="wrap_content"
btnBegin = (Button) findViewById(R.id.btnBegin); the many buttons sent android:background="#88eed0d0" />
btnExit = (Button) findViewById(R.id.btnExit);
the signal and proceeds
<Button
btnBegin.setOnClickListener(this); from there. android:id="@+id/btnBegin"
btnExit.setOnClickListener(this); android:layout_width="wrap_content"
}//onCreate android:layout_height="wrap_content"
android:ems="5"
android:text="Begin" />
@Override
public void onClick(View v) { <Button
if (v.getId() == btnBegin.getId()) { android:id="@+id/btnExit"
txtMsg.setText("1-You clicked the 'BEGIN' button"); android:layout_width="wrap_content"
} android:layout_height="wrap_content"
if (v.getId() == btnExit.getId()) { android:ems="5"
txtMsg.setText("2-You clicked the 'EXIT' button"); android:text="Exit" />
}
</LinearLayout>
}//onClick
} 4 - 62 4 - 63
<ImageButton
• Each widget takes an android:id="@+id/imgButton1"
android:src or android:layout_width="wrap_content"
android:background android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" >
attribute (in an XML layout) to specify what picture </ImageButton>
to use.
<ImageView
android:id="@+id/imgView1"
• Pictures are stored in the res/drawable folder android:layout_width="200dp"
android:layout_height="150dp"
(optionally a medium, high, x-high, xx-high, and xxx- android:scaleType="fitXY"
high respectively definition version of the same android:src="@drawable/flowers1" >
image could be stored for later usage with different </ImageView>
at: http://developer.android.com/design/style/iconography.html
HINT: Several websites allow you to convert for free your
pictures to image-files under a variety of formats and sizes
such as png, .jpg, .gif, etc. For instance try:
http://www.prodraw.net/favicon/index.php
http://converticon.com/
4 - 66 4 - 67
<TextView
android:id="@+id/txtLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_light"
android:text="@string/ACME_Login_Screen"
android:textSize="20sp"
android:textStyle="bold" />
Capitals & Setting
Hint spelling text <EditText
Disable android:id="@+id/edtUserName"
button android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
A brief android:hint="@string/Enter_your_First_and_Last_name"
message box android:inputType="textCapWords|textAutoCorrect"
android:textSize="18sp" >
<requestFocus />
</EditText>
4 - 70 4 - 71
Images from an HTC-One device
LAYOUT 2 of 2
public class MainActivity extends ActionBarActivity {
<Button // class variables representing UI controls to be controlled from the Java program
android:id="@+id/btnLogin" TextView txtLogin;
android:layout_width="82dp" EditText edtUserName;
android:layout_height="wrap_content" Button btnLogin;
android:layout_marginTop="2dp"
android:text="@string/login" /> // variables used with the Toast message class
</LinearLayout> private Context context;
private int duration = Toast.LENGTH_SHORT;
@Override
res/values/strings.xml public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
<?xml version="1.0" encoding="utf-8"?>
// show the login screen
<!-- this is the res/values/strings.xml file -->
setContentView(R.layout.activity_main);
<resources>
context = getApplicationContext();
<string name="app_name">GuiDemo</string>
// binding the UI's controls defined in "main.xml" to Java code
<string name="action_settings">Settings</string>
txtLogin = (TextView) findViewById(R.id.txtLogin);
<string name="login">login</string>
edtUserName = (EditText) findViewById(R.id.edtUserName);
<string name="ACME_Login_Screen">ACME Login Screen</string>
btnLogin = (Button) findViewById(R.id.btnLogin);
<string name="Enter_your_First_and_Last_name">Enter your First and Last name</string>
</resources>
4 - 72 4 - 73
Android - Graphical User Interfaces Android - Graphical User Interfaces
Example10: Login-Screen - MainActivity 2 of 3 Example10: Login-Screen - MainActivity 3 of 3
}// onCreate
4 - 74 4 - 75
<TextView <Button
android:id="@+id/labelCoffee" android:id="@+id/btnPay"
android:layout_width="match_parent" android:layout_width="153dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="#ff993300" android:text="@string/pay"
android:text="@string/coffee_addons" android:textStyle="bold" />
android:textColor="@android:color/white"
android:textStyle="bold" /> </LinearLayout>
<CheckBox
android:id="@+id/chkCream"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cream"
android:textStyle="bold" />
78
4 - 78 4 - 79
4 - 80 4 - 81
Android - Graphical User Interfaces Android - Graphical User Interfaces
Example11: CheckBoxes – CaféApp [Code 2 of 2] Basic Widgets: CheckBoxes
• A radio button (like a CheckBox) is a two-states button that
//LISTENER: wiring button-events-&-code
btnPay.setOnClickListener(new OnClickListener() { can be either checked or unchecked.
@Override
public void onClick(View v) { • Logically related radio buttons are normally put together in a RadioGroup
String msg = "Coffee "; container. The container forces the enclosed radio buttons to behave as
if (chkCream.isChecked()) {
msg += " & cream ";
mutually exclusive selectors. That is, the checking of one radio button
} unchecks all the others.
if (chkSugar.isChecked()){
msg += " & Sugar";
} • Properties for font face, style, color, etc. are managed in a way similar to
Toast.makeText(getApplicationContext(), setting a TextView.
msg, Toast.LENGTH_SHORT).show();
//go now and compute cost...
• You may call the method isChecked() to see if a specific RadioButton is
}//onClick
});
selected, or change its state by calling toggle().
}//onCreate
}//class
4 - 82 4 - 83
<RadioButton
android:id="@+id/radExpresso"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/expresso" />
<RadioButton
android:id="@+id/radColombian"
android:layout_width="wrap_content"
Summary of choices android:layout_height="wrap_content"
android:checked="true"
android:text="@string/colombian" />
</RadioGroup>
4 - 84 485
- 85
Android - Graphical User Interfaces Android - Graphical User Interfaces
Example12: CheckBoxes – CaféApp [MainActivity] Example12: CheckBoxes – CaféApp [MainActivity]
public class MainActivity extends Activity { // LISTENER: wiring button-events-&-code
btnPay.setOnClickListener(new OnClickListener() {
@Override
CheckBox chkCream;
public void onClick(View v) {
CheckBox chkSugar; String msg = "Coffee ";
Button btnPay; if (chkCream.isChecked())
msg += " & cream ";
RadioGroup radCoffeeType; if (chkSugar.isChecked())
RadioButton radDecaf; msg += " & Sugar";
RadioButton radExpresso;
// get selected radio button ID number
RadioButton radColombian; int radioId = radCoffeeType.getCheckedRadioButtonId();
@Override
// compare selected's Id with individual RadioButtons ID
public void onCreate(Bundle savedInstanceState) { if (radColombian.getId() == radioId)
super.onCreate(savedInstanceState); msg = "Colombian " + msg;
setContentView(R.layout.main); // similarly you may use .isChecked() on each RadioButton
if (radExpresso.isChecked())
chkCream = (CheckBox) findViewById(R.id.chkCream); msg = "Expresso " + msg;
// similarly you may use .isChecked() on each RadioButton
chkSugar = (CheckBox) findViewById(R.id.chkSugar);
if (radDecaf.isChecked())
btnPay = (Button) findViewById(R.id.btnPay); msg = "Decaf " + msg;
radCoffeeType = (RadioGroup) findViewById(R.id.radioGroupCoffeeType);
Toast.makeText(getApplicationContext(), msg, 1).show();
radDecaf = (RadioButton) findViewById(R.id.radDecaf); // go now and compute cost...
}// onClick
radExpresso = (RadioButton) findViewById(R.id.radExpresso);
});
radColombian = (RadioButton) findViewById(R.id.radColombian); }// onCreate
488
- 88 4 - 89
Appendix A. Using the @string resource
User A good programming practice in Android is NOT to directly enter literal strings as
immediate values for attribute inside xml files.
Interfaces For example, if you are defining a TextView to show a company headquarter’s
location, a clause such as android:text="Cleveland" should not be used
(observe it produces a Warning [I18N] Hardcoded string “Cleveland”,
should use @string resource )
2. Whenever the string is needed provide a reference to the string using the
notation @string/headquarter. For instance in our example you should enter
android:text="@string/headquarter"
WHY?
If the string is used in many places and its actual value changes we just update the
This image was made using the resource file entry once. It also provides some support for internationalization -easy to
Device Frame Generator, which is part of
change a resource string from one language to another.
the Android Asset Studio tool
http://romannurik.github.io/AndroidAssetStudio/ 4 - 90 4 - 91
This tool offers a number of options to craft high-quality icons and other
displayed elements typically found in Android apps.
4 - 92 4 - 93
Appendix D. Measuring Graphic Elements Appendix D. Measuring Graphic Elements
How Android deals with screen resolutions?
Q. What is dpi (also know as dp and ppi) ? Illustration of how the Android platform maps actual screen densities and
Stands for dots per inch. It suggests a measure of screen quality. sizes to generalized density and size configurations.
You can compute it using the following formula:
A set of four generalized screen sizes
xlarge screens are at least 960dp x 720dp
dpi = widthPixels + heightPixels / diagonalInches
dpi = sqrt (width_pixels^2
2 + height_pixels^2)
2 / diagonal_inches
large screens are at least 640dp x 480dp A set of six generalized densities:
normal screens are at least 470dp x 320dp ldpi ~120dpi (low)
small screens are at least 426dp x 320dp mdpi ~160dpi (medium)
G1 (base device 320x480) 155.92 dpi (3.7 in diagonally) hdpi ~240dpi (high)
Nexus (480x800) 252.15 dpi xhdpi ~320dpi (extra-high)
HTC One (1080x1920) 468 dpi (4.7 in) xxhdpi ~480dpi (extra-extra-high)
Samsung S4 (1080x1920) 441 dpi (5.5 in) Xxxhdpi ~640dpi (extra-extra-extra-high)
sp
Scale-independent Pixels – similar to the relative density dp unit, but used for
font size preference.
4 - 94 4 - 95
Taken from: http://developer.android.com/guide/practices/screens_support.html
<Button
android:id="@+id/button1"
android:layout_height="wrap_content" 180 120 180
android:layout_width="120dp"
android:layout_gravity="center"
480
android:text="@+id/go_caption" />
If the application is deployed on devices having a higher resolution the button is still
mapped to the middle of the screen.
4 - 96 4 - 97
Appendix F. Customizing Widgets Appendix F. Customizing Widgets
1. The appearance of a widget can be adjusted The image shows visual feedback provided to the user during the clicking of a standard
by the user. For example a button widget and a custom Button widget. Assume the device runs under SDK4.3.
could be modified by changing its shape,
border, color, margins, etc.
When focused
the standard box
shows a blue
bottom line
A focused
custom box
shows an orange
all-around frame
1. Non-focused custom
EditText widget, grey 3. Focused custom
border EditText widget showing
an orange border
<EditText
Definition of the custom templates for android:id="@+id/editText1"
Button and EditText widgets android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:ems="10"
android:inputType="text"
android:text="@string/standard_edittext" >
Layout referencing standard and custom <requestFocus />
made widgets </EditText>
<Button
android:id="@+id/button1"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:text="@string/standard_button" />
4 - 102 4 - 103
Appendix G: Fixing Bleeding Background Color Appendix H: Useful Color Theme (Android Holo)
You may change a layout’s color by simply adding in the XML layout the clause
android:background="#44ff0000" (color is set to semi-transparent red). The screen shows color included in Android’s Holo-Theme. The Holo-Theme
color set provides a palette of harmonious colors recommended for all your
The problem is that the layout color appears to be placed on top of the other controls
making them look ‘smeared’ as show in the figure below (right). applications.
Benefits: uniform design, homogeneous
Although tedious, a solution is to reassert the smeared widgets’ appearance by user-experience, beauty(?)…
explicitly setting a value in their corresponding android:background XML attributes.
The figure on the left includes explicit assignments to the widgets’ background. You may want to add the following entries to your
res/values/colors.xml file. Example of usage:
android:background="@color/holo_blue_light"
</resources>
1. android:background="@android:drawable/edit_text"
2. android:background="@android:drawable/editbox_dropdown_light_frame"
3. android:background="@android:drawable/btn_default" For a long list of HEX colors to be copied in your res/values/colors.xml resource file
4 - 108
see http://stackoverflow.com/questions/3769762/android-color-xml-resource-file