Category: Android

  • Creating a basic Android user interface

    In this exercise we’re going to create a simple application that uses the following controls:

    • Button
    • Text field
    • Checkbox
    • Radio button
    • Spinner

    The spinner will select between two languages, English and Tagalog and update the user interface in real time.

    When the button is pressed it will display a message in the selected language.

    The screens will look like:

    Android UI excersise - English
    Android UI excersise – Tagalog

    Android UI excersise - Tagalog
    Android UI excersise – English

    Below the send button will appear the message that has been sent when the Send button is pressed.

    First, create the following project in Android Studio and configure as per below:

    Application name: Task Performance
    Company domain: Your domain name
    Project location: Path to your own folder

    Set the minimum SDK to API 8: Android 2.2 (Froyo)

    Create a blank activity with the following settings:

    Activity name: TaskPerfActivity
    Layout name: activity_task_perf

    You can now update the relevant files in the project with the following and make sure you update the Tagalog translations in manifests\AndroidManifest.xml file.

    The code:

    The first file is the AndroidManifest.xml file. This one remains fairly standard as created.

    manifests\AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="edu.sti.taskperformance">
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".TaskPerfActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    

    Next we create the layout. You can do this in two ways, one using the visual editor and dropping the controls where you want them or copy/paste the following into the activity_ask_perf.xml file. If you do choose the first option, you will need to make sure you name the controls as per the file here so the rest of the application will work.

    res\layout\activity_ask_perf.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="edu.sti.taskperformance.TaskPerfActivity"
        android:id="@+id/ljhkjh">
    
        <Spinner
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/spinner"
            android:prompt="@string/spinner_title"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Beautiful"
            android:id="@+id/cbxMagandaAko"
            android:layout_below="@+id/txtEmail"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:checked="false" />
    
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Ugly"
            android:id="@+id/cbxPangitAko"
            android:checked="false"
            android:layout_below="@+id/cbxMagandaAko"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Send"
            android:id="@+id/btnSend"
            android:layout_marginTop="48dp"
            android:layout_below="@+id/cbxMagandaAko"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignRight="@+id/spinner"
            android:layout_alignEnd="@+id/spinner"
            android:onClick="onSendButtonClicked" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="First Name"
            android:id="@+id/lblFirstName"
            android:layout_below="@+id/spinner"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="16dp" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Last Name"
            android:id="@+id/lblLastName"
            android:layout_below="@+id/lblFirstName"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="16dp" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Email"
            android:id="@+id/lblEmail"
            android:layout_below="@+id/lblLastName"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="16dp" />
    
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/txtFirstName"
            android:layout_alignBottom="@+id/lblFirstName"
            android:layout_alignRight="@+id/spinner"
            android:layout_alignEnd="@+id/spinner" />
    
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/txtLastName"
            android:layout_above="@+id/lblEmail"
            android:layout_alignLeft="@+id/txtFirstName"
            android:layout_alignStart="@+id/txtFirstName" />
    
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textEmailAddress"
            android:ems="10"
            android:id="@+id/txtEmail"
            android:layout_below="@+id/lblLastName"
            android:layout_alignLeft="@+id/txtLastName"
            android:layout_alignStart="@+id/txtLastName" />
    
        <RadioGroup
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/cbxMagandaAko"
            android:layout_alignBottom="@+id/cbxPangitAko"
            android:layout_gravity="right"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:id="@+id/radioGroup">
            <RadioButton
                android:layout_width="136dp"
                android:layout_height="wrap_content"
                android:text="Girl"
                android:id="@+id/radGirl"
                android:onClick="onRadioButtonClicked" />
            <RadioButton
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Boy"
                android:id="@+id/radBoy"
                android:layout_below="@+id/radGirl"
                android:layout_alignRight="@+id/radGirl"
                android:layout_alignEnd="@+id/radGirl"
                android:onClick="onRadioButtonClicked" />
        </RadioGroup>
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text=""
            android:id="@+id/txtResult"
            android:layout_marginTop="15dp"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:layout_below="@+id/btnSend" />
    </RelativeLayout>

    manifests\AndroidManifest.xml

    Now the fun begins. We create the code that actually makes things work. First step is to make sure all the imports are included. I’d probably suggest copying that section from the listing below first.

    You will notice that the class is not quite the same as the default class that Android Studio created for you. This one extends Activity and it implements OnItemSelectedListener. This is part of the Spinner control.

    package edu.sti.taskperformance;
    
    import android.os.Bundle;
    import java.util.ArrayList;
    import java.util.List;
    import java.lang.String;
    import android.app.Activity;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.RadioButton;
    import android.widget.Spinner;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.widget.AdapterView.OnItemSelectedListener;
    
    public class TaskPerfActivity extends Activity implements OnItemSelectedListener {
    
        private String boyGirl = "";
        private String language = "English";
        private String result = "";
        private String isBeautiful = "";
        private String isUgly = "";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_task_perf);
    
            // Spinner element
            Spinner spinner = (Spinner) findViewById(R.id.spinner);
    
            // Spinner click listener
           // spinner.setOnItemSelectedListener(this);
            spinner.setOnItemSelectedListener(this);
    
            // Spinner Drop down elements
            List categories = new ArrayList();
            categories.add("English");
            categories.add("Tagalog");
    
            // Creating adapter for spinner
            ArrayAdapter dataAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, categories);
    
            // Drop down layout style - list view with radio button
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    
            // attaching data adapter to spinner
            spinner.setAdapter(dataAdapter);
        }
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            // On selecting a spinner item
            String item = parent.getItemAtPosition(position).toString();
            // first create references to the controls we want to change based on language selection
            CheckBox cbxMagandaAko = (CheckBox)findViewById(R.id.cbxMagandaAko);
            CheckBox cbxPangitAko = (CheckBox)findViewById(R.id.cbxPangitAko);
            RadioButton radBoy = (RadioButton)findViewById(R.id.radBoy);
            RadioButton radGirl = (RadioButton)findViewById(R.id.radGirl);
            Button btnSend = (Button)findViewById(R.id.btnSend);
            TextView lblFirstName = (TextView)findViewById(R.id.lblFirstName);
            TextView lblLastName = (TextView)findViewById(R.id.lblLastName);
            TextView lblEmail = (TextView)findViewById(R.id.lblEmail);
            // Now we check to see if English selected and set labels to English
            if (item == "English") {
                cbxMagandaAko.setText("Beautiful");
                cbxPangitAko.setText("Ugly");
                radBoy.setText("Boy");
                radGirl.setText("Girl");
                btnSend.setText("SEND");
                lblFirstName.setText("First Name");
                lblLastName.setText("Last Name");
                lblEmail.setText("Email");
                language = "English";
            }
            else // if not English, must be Tagalog
            {
                cbxMagandaAko.setText("Magando ako");
                cbxPangitAko.setText("Pangit ako");
                radBoy.setText("Batang lalaki");
                radGirl.setText("batang babae");
                btnSend.setText("MAGPADALA");
                lblFirstName.setText("Pangalan");
                lblLastName.setText("Huling pangalan");
                lblEmail.setText("Email");
                language = "Tagalog";
            }
    
            // Showing selected spinner item
            {
                Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
            }
        }
        public void onNothingSelected(AdapterView<?> arg0) {
            // Auto-generated method stub
        }
    
        public void onRadioButtonClicked(View view) {
            // Is the button now checked?
            boolean checked = ((RadioButton) view).isChecked();
    
            // Check which radio button was clicked
            switch(view.getId()) {
                case R.id.radBoy:
                    if (checked)
                        boyGirl = "boy";
                        break;
                case R.id.radGirl:
                    if (checked)
                        boyGirl = "girl";
                        break;
            }
        }
    
        public void onSendButtonClicked(View view) {
            // This will create the text to display at bottom of screen when the send button is clicked
    
            // first need to create references to the controls so you can access the data
            EditText txtFirstName = (EditText)findViewById(R.id.txtFirstName);
            EditText txtLastName = (EditText)findViewById(R.id.txtLastName);
            EditText txtEmail = (EditText)findViewById(R.id.txtEmail);
            CheckBox cbxMagandaAko = (CheckBox)findViewById(R.id.cbxMagandaAko);
            CheckBox cbxPangitAko = (CheckBox)findViewById(R.id.cbxPangitAko);
    
            // See what check boxes are checked and set the variables
    
    
            // now check what language is being used
            if (language == "English") {
                // get the value from the check box and update variables
                if (cbxMagandaAko.isChecked())
                    isBeautiful = "is beautiful";
                else
                    isBeautiful = "is not beautiful";
                if (cbxPangitAko.isChecked())
                    isUgly = "is ugly";
                else
                    isUgly = "is not ugly";
                // create the string to display
                result = "Sent message to " + txtEmail.getText() + " that " + txtFirstName.getText();
                result = result + " " + txtLastName.getText() + " is a ";
                result = result + boyGirl + " and " + isBeautiful + " and " + isUgly;
            }
            else // the language is not English so must be Tagalog
            {
                // TODO You should check the strings (green text) to make sure they are correct Tagalog
                // get the value from the check box and update variables
                if (cbxMagandaAko.isChecked())
                    isBeautiful = "ay maganda";
                else
                    isBeautiful = "hindi maganda";
                if (cbxPangitAko.isChecked())
                    isUgly = "ay pangit";
                else
                    isUgly = "hindi pangit";
                // create the string to display
                result = "Ipinadala mensahe sa " + txtEmail.getText() + " na " + txtFirstName.getText();
                result = result + " " + txtLastName.getText() + " ay isang ";
                result = result + boyGirl + " at " + isBeautiful + " at " + isUgly;
            }
            // create reference for the text field at bottom used to display result
            TextView txtResult = (TextView)findViewById(R.id.txtResult);
            // display the string at bottom part of the screen
            txtResult.setText(result.toString());
        }
    }
    

    res\values\strings.xml

    <resources>
        <string name="app_name">Task Performance</string>
        <string name="action_settings">Settings</string>
        <string name="spinner_title">Settings</string>
    </resources>