In my great expectations of Google Android coming to Canada on June 2nd, I’ve started experimenting with developing some apps for the Android platform. My first app is called “The Taxman” and will calculate the amount of tax you owe per year in your province/state – well only Canada for now.
I had trouble adjusting to what an “Activity” was and how to handle it. Here is a quick and dirty way to create an Activity, and to switch to another Activity (think of it as another screen) on the click of a button.
1. Create a new Android project – or you might already have one created.
2. Add a new Class that extends android.app.Activity. You need a total of two classes that extend Activity. You will switch from one Activity to another.
3. Now, we’ll create two XML files to store the layout of each Activity. Under the res/layouts directory create a copy of main.xml
4. Each XML file will contain 1 button. On the click of the button, the Activities will switch.
main.xml will contain:
<?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" android:background="#ffffff" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#000000" android:text="This is Activity 1" /> <Button android:text="Next" android:id="@+id/Button01" android:layout_width="250px" android:textSize="18px" android:layout_height="55px"> </Button> </LinearLayout>
main2.xml will contain:
<?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" android:background="#ffffff" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#000000" android:text="This is Activity 2" /> <Button android:text="Previous" android:id="@+id/Button02" android:layout_width="250px" android:textSize="18px" android:layout_height="55px"> </Button> </LinearLayout>
So each Activity will have a text that says “This is Activity x” and a button to switch the Activity.
5. Add the second Activity to the main manifest file. Open AndroidManifest.xml and add:
<activity android:name=".Activity2"></activity>
The final result will look similar to this:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.warriorpoint.taxman2" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Activity1" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Activity2"></activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest>
If you forget to do this, then the you will get a Null Pointer exception because “Activity2” will not be found at runtime. It took me some time to find out how to find what Exception was getting thrown as well. I will include how to debug and look at Exceptions in another future post.
5. Open Activity1.java and enter the following code:
package com.warriorpoint.taxman2; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class Activity1 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button next = (Button) findViewById(R.id.Button01); next.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Intent myIntent = new Intent(view.getContext(), Activity2.class); startActivityForResult(myIntent, 0); } }); } }
Here’s a quick explanation of what this does:
- setContentView(R.layout.main) makes sure that main.xml is used as the layout for this Activity.
- Gets a reference to the button with ID Button01 on the layout using (Button) findViewById(R.id.Button01).
- Create san OnClick listener for the button – a quick and dirty way.
- And the most important part, creates an “Intent” to start another Activity. The intent needs two parameters: a context and the name of the Activity that we want to start (Activity2.class)
- Finally, the Activity is started with a code of “0”. The “0” is your own code for whatever you want it to mean. Activity2 will get a chance to read this code and use it. startActivityForResult means that Activity1 can expect info back from Activity2. The result from Activity2 will be gathered in a separate method which I will not include here.
6. Open Activity2.java and enter the code below:
package com.warriorpoint.taxman2; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class Activity2 extends Activity { /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main2); Button next = (Button) findViewById(R.id.Button02); next.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Intent intent = new Intent(); setResult(RESULT_OK, intent); finish(); } }); }
This code does the following:
- Sets main2 as the layout for this Activity
- Gets a reference to Button02 and creates an OnClick listener
- In the OnClick listener, the Activity finishes with finish(). setResult() returns information back to Activity 1. In this example, it returns no information; and Activity1 doesn’t even have the listener to receive this information anyway.
That’s it! Run it!
The app will load in Activity 1:
When you click the button you will see Activity 2. There are no animations, no tweens, etc, so the screen will just “change”. I’ll talk about animations in future posts.
And clicking on the button “Previous” here will go back to Activity1.
Still to come:
1. How to create animations when switching screens.
2. How to switch using a dragging motion of your finger.
3. How to see a log of the exceptions that your app throws.

June 11, 2009 at 07:52
A simple question…
What makes the emulator start with Activity1 rather than Activity2? Is it the addition of
?
Thanks.
Tim
June 16, 2009 at 11:22
Hey Tim,
If I’m not mistaken it’s the following lines in the Manifest that make Activity1 the default activity:
June 16, 2009 at 11:22
The opening and closing tags got cut out.
intent-filter
action android:name=”android.intent.action.MAIN” /
category android:name=”android.intent.category.LAUNCHER” /
/intent-filter
July 6, 2009 at 06:36
If your screens are simple it is better to use Layouts instead of definining it as activity by switching Layouts
July 6, 2009 at 22:08
Cool. Thanks
August 12, 2009 at 00:54
how can i find out need tip solve those problem?
1. How to create animations when switching screens.
2. How to switch using a dragging motion of your finger.
3. How to see a log of the exceptions that your app throws.
thanks
August 22, 2009 at 01:19
I thought this was a great tutorial–straightforward, lots of detail, and it picked up right where the sample “Hello, Android” app left off.
I couldn’t understand why my version of your application crashed whenever I pressed the Next button. Finally I figured it out–thanks to your subsequent post about reading the logs:
E/AndroidRuntime( 1001): android.content.ActivityNotFoundException: Unable to find explicit activity class {tld.domain.helloandroid/tld.domain.helloandroid.Activity2}; have you declared this activity in your AndroidManifest.xml?
Pretty clear message! Since I had been building off the “Hello, Android” sample, I just added a new class file for Activity2, which wasn’t properly registered in the AndroidManifest.xml file. Just thought I’d mention that here in case anyone else makes the same mistake.
August 23, 2009 at 12:17
Awesome, thank you very much Chris for posting that; and thanks for the kind words as well.
September 29, 2009 at 01:55
Hi!
do you have an idea on passing an object Bundle back to the first activity and how can you retrieve the data?
Nice Tutorial. Thanks for the info…
October 16, 2009 at 08:41
And if I want to switch activity trought MenuItem, how can i do?
Thanks
November 26, 2009 at 13:28
Hi there. I’d like to learn to program on Android but I’m completely clueless about how the activities work. I wanted to ask, how do you pass parameters to activities? I want to be able to change colour settings for a “game” activity based on a selection made in a “Settings” activity. Could you tell me how to pass variable values across activities?
Thanks
December 3, 2009 at 18:45
hey..
that really helped. thanks:)
December 7, 2009 at 07:17
this is really great!!!
thanks a lot.
December 11, 2009 at 11:47
Many thanks for this! So many of the demos out there just demo API fnality, all just in Java, all in onCreate, with zero clues as to how to manage this kind of simple application flow. What are we supposed to do, fill onCreate with dozens of lines of Java?!
Thanks again 
December 15, 2009 at 21:53
Just what I’m looking for!
December 27, 2009 at 17:18
Thanks for writing.
December 27, 2009 at 17:18
…this.
December 28, 2009 at 18:39
Hi, thanks for this. Best tutorial i found.
January 5, 2010 at 11:52
i have to agree with everyone. this is an excellent tutorial. thank you so much for putting it together.
January 7, 2010 at 11:34
Thanks! I’ve been looking at how to do this for a couple of hours!
January 15, 2010 at 04:20
me also stuck up for two days……..
thank you very much its working fine…..
February 3, 2010 at 23:28
Great post, took about 10 minutes to get the example working! Thanks a bunch!
February 5, 2010 at 19:48
An excellent introduction for one who is learning to develop with Android. Thanks for taking the time to write it up!
February 9, 2010 at 08:55
Hi,
In am developing a android application. The framework is such that I dont allow Activities to laucnh each other.
Eg: ActivityA can only talk to datahandlerA
ActivityB can only talk to datahandlerB
datahandlers can talk to any other datahandlers.
Some operation happens on ActA. It informs DHA. DHA does some network operation. It informs DHB. DHB does some process than launches ActB.
Please let me know how this can be done.
Thanks
Sam
March 8, 2010 at 00:59
thanks……..got it
March 18, 2010 at 14:11
Thanks!
I found this useful, after several hours of NOT finding this information on the developers site. I modified it for my app, and it worked.
I tried adding onClick method to button and adding a click listner to my code and both of those solutions did not work. This did the trick!
March 18, 2010 at 14:24
Also, I just noticed this also lets the BACK button (hardware) work as well, so you can go back to the last activity. Smooth!
April 25, 2010 at 19:08
hey,
Thanks for the useful post.
I’d like to know if there is a way by which i can know the name of the activity that started my current activity.
my problem is that i react differently according to which activity started me.
Thank you
April 29, 2010 at 04:56
Hey nice tutorial man but i have a query
I am using a listview to create a list of items
and then when the user clicks on or touches on one item he is shown the activity of that particular item. The problem i am having is that :-
1.How can i set an onclicklistener for list view
2.Do i have to validate each item separately because i have like 50 items and so and then writting the code somewhat like:-
“IF this item is clicked then do this and bla bla” will take a hell lot of time. M sure there will be some way in which we can find out the item clicked by user and then store it’s position in some variable and then thru dat variable call the respective activity this shudnt take more than 4 lines of code but i m stuck and cudnt get anythng in my head.
Any suggestions will be highly appreciated
abhishek@delvelogic.com
May 19, 2010 at 10:49
I got a question. What could be a reason of misworking back button action. I mean - when I enter another activity, i press back button (on emulator) and instead of going back it shows up android desktop… I am overriding the
public void onBackPressed() {
Log.e(”myTag”, “out…”);
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
}
but it only throw log, still not working properly..
June 14, 2010 at 07:24
I love you!!
I’ve been trying to find some place that will explain how to start an activity in a simple way, but I’ve just found shit that was loads of code and I could not managed to get it to work. When I just stumbled across this post and I realize it’s as simple as pie if someone just explain in the great way you did in this post!
I hope you have a great day, I know mine just got a little bit better, Thanks again!
June 15, 2010 at 06:53
HI Abhishek,
I think this gonna help u,
package com.example.helloandroid;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class ListExample extends ListActivity {
/** Called when the activity is first created. */
static final String[] COUNTRIES = new String[] {
“Afghanistan”, “Albania”, “Algeria”, “American Samoa”, “Andorra”,
“Angola”, “Anguilla”, “Antarctica”, “Antigua and Barbuda”, “Argentina”,
“Armenia”, “Aruba”, “Australia”, “Austria”, “Azerbaijan”,
“Bahrain”, “Bangladesh”, “Barbados”, “Belarus”, “Belgium”};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] countries = getResources().getStringArray(R.array.countries_array);
setListAdapter(new ArrayAdapter(this, R.layout.list_item, countries));
// setListAdapter(new ArrayAdapter(this, R.layout.list_item, COUNTRIES));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
});
}
}
June 29, 2010 at 23:51
simple, gets the job done. thanks!
July 8, 2010 at 15:57
Thanks so much !!! You’ve saved me hours and hours of searching.
July 19, 2010 at 08:08
i am calling activities inside an activity in songle tab host, but when i press back button from any of sub activity (on emulator) and instead of going back it shows up android desktop. Please guide me. Thanks.
July 23, 2010 at 11:42
Awesome.
I was flipping back & forth in the pages of my Android Wireless Development Book for 2 days trying to get this to work. The example you gave was the best way to describe it. Simple layouts & clear examples of code. I was able to copy/paste 6 lines of code off your site and everything is working now.
Thanks for taking the time to share the knowledge!
July 23, 2010 at 20:25
Boyan - Great tutorial! I got Activity 1 to slide (R to L) to Activity 2. How do I slide back (L to R) from Activity 2 to Activity 1? Thanks.
July 23, 2010 at 20:29
Boyan - I found my own personal error…your code is perfect!