«

»

Feb 17

Print this Post

How to implement your own Listener in Android/Java

When you’re developing application, there is often a need to create your own controls/widgets/classes or to extend already available ones. And in most cases, you want this control/widget to be as flexible as possible. In order to achieve this, you have to create special events, which can be handled outside of your widget. Some of the popular examples are OnClickListener and OnKeyListener. But sometimes you need Events/Listener which aren’t predefined by the Java or Android SDK. In this case, you have to create your own Listener interface. In the last post, I’ve shown three different way on how to implement Listeners in your application. Now I’ll show you how to implement your own Listeners.
To demonstrate this, we’ll use our LoginExample activity and modify it slightly to act as a RegisterExample, where you can enter a username + password to create an account. Our goal is to create an application which will allow user to register/create a new account and while the user type his name in the user field, to check “live” if the username is already in use or not. After creating a new project, we’ll copy the main.xml and LoginExample.java file into their respective directories. The LoginExample.java will be renamed RegisterExample.java. First, we do some changes to the main.xml, in order to add a second password field and an TextView, which show us if the username is available or not, as well as changing some labels/texts. The final XML can be seen below
<?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"
    >
	<TextView
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="Please enter your desired username"
	    />
	<TextView
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="Login:"
	    />
	<EditText
		android:id="@+id/username"
		android:singleLine="true"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<TextView
		android:id="@+id/userstatus"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    />
	<TextView
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="Password:"
	    />
	<EditText
		android:id="@+id/password"
		android:password="true"
		android:singleLine="true"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<TextView
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="Repeat your password:"
	    />
	<EditText
		android:id="@+id/password2"
		android:password="true"
		android:singleLine="true"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<Button
		android:id="@+id/register_button"
		android:text="Register"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<Button
		android:id="@+id/cancel_button"
		android:text="Cancel"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<TextView
		android:id="@+id/result"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    />
</LinearLayout>
If you now start the application, it should look like on the picture below. Screen1 Next, we clean up some of the code from LoginExample and remove unnecessary code as well as refactoring some variable names. The final code should look something like
package com.tseng.examples;

import com.tseng.examples.CheckUsernameEditText.OnUsernameAvailableListener;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class RegisterExample extends Activity {
	// Declare our Views, so we can access them later
	private EditText etUsername;
	private EditText etPassword;
	private EditText etPassword2;
	private Button btnRegister;
	private Button btnCancel;
	private TextView lblUserStatus;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Set Activity Layout
        setContentView(R.layout.main);

        // Get the EditText and Button References
        etUsername = (EditText)findViewById(R.id.username);
        etPassword = (EditText)findViewById(R.id.password);
        etPassword2 = (EditText)findViewById(R.id.password2);
        btnRegister = (Button)findViewById(R.id.register_button);
        btnCancel = (Button)findViewById(R.id.cancel_button);
        lblUserStatus = (TextView)findViewById(R.id.userstatus);

        // Set Click Listener
        btnRegister.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// create Account
			}
		});
        btnCancel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// Close the application
				finish();
			}
		});
    }
}
So far, it looks like our LoginExample. Now the real work can begin. Our goal is to extend the EditText widget for user field and our own code to it, which will check if the username is already in use or not. First, we have to create a new class. We’ll call it CheckUsernameEditText. Once you create the application and it’s default supper class constructors, our first step is to create our own interface.
	// Define our custom Listener interface
	public interface OnUsernameAvailableListener {
		public abstract void onAvailableChecked(String username, boolean available);
	}
Our OnUsernameAvailableListener interface is quite simple and only has defined one abstract method. This method will be called, every time the username was checked and notify the user of the widget if the name was available or not. Now that we have defined the interface, we have to create a variable which will hold the listener by adding this line to top of our CheckUsernameEditText class.
	OnUsernameAvailableListener onUsernameAvailableListener = null;
Next one, we a setter to allow others to listen to this event.
	// Allows the user to set an Listener and react to the event
	public void setOnUsernameAvailableListener(OnUsernameAvailableListener listener) {
		onUsernameAvailableListener = listener;
	}
And last step is to add a small function which we will call every time to trigger the event (and we don’t have to repeat the checking code inside it every time)
	// This function is called after the check was complete
	private void OnUserChecked(String username, boolean available){
		// Check if the Listener was set, otherwise we'll get an Exception when we try to call it
		if(onUsernameAvailableListener!=null) {
			// Only trigger the event, when we have a username
			if(!TextUtils.isEmpty(username)){
				onUsernameAvailableListener.onAvailableChecked(username, available);
			}
		}
	}
So, that was the most important code in creating your own listeners. When ever you want to trigger this event, simply call OnUserChecked(username, available); Currently however, it’s never called. So we need to listen to user input and check the file. We’ll do this, by implementing the OnKeyListener interface to our CheckUserEditText class by changing the class definition to
public class CheckUsernameEditText extends EditText implements OnKeyListener {
Next we have to implement the onKey method, which will be called every time the user presses a key.
	@Override
	public boolean onKey(View v, int keycode, KeyEvent keyevent) {
		// We only want to handle ACTION_UP events, when user releases a key
		if(keyevent.getAction()==KeyEvent.ACTION_DOWN)
			return false;

		boolean available = true;

		// Whenever a user press a key, check if the username is available
		String username = getText().toString().toLowerCase();
		if(!TextUtils.isEmpty(username)){
			// Only perform check, if we have anything inside the EditText box
			for(int i=0; i<registeredUsers.length; i++) {
				if(registeredUsers[i].equals(username)){
					available = false;
					// Finish the loop, as the name is already taken
					break;
				}
			}
			// Trigger the Event and notify the user of our widget
			OnUserChecked(username, available);
			return false;
		}
		return false;
	}
This will check the entered text if the entered username is already available inside our registeredUsers array and set the available variables value to false if the name is already registered, otherwise leave it at it’s standard value of true. Lastly it will call OnUserChecked method, passing by username and it’s status to the listening function.
This will cause an error, because we haven’t defined registeredUsers yet. registeredUsers in our example is a simple String[] array, which will contain a few already registered names.
	final private static String[] registeredUsers = new String[] {
		// This is just a fixed List for tutorial purposes
		// in a real application you'd check this server sided or inside the database
		"tseng",
		"admin",
		"root",
		"joedoe",
		"john"
	};
In your real application you want to get this data from a remote server, an preferences file or from an sqlite database
Our application doesn’t receive any onKey events yet, because we haven’t registered the listener with the TextView’s onKeyListener. So we have to add this line in every of the 3 super class constructors
 //Set KeyListener to ourself
this.setOnKeyListener(this);
Now our CheckUsernameEditText widget is done. How ever, if we start the application we won’t notice a difference, because we haven’t replaced the username’s EditText widget with our own one. We need to change line 17 of our main.xml into
	<com.tseng.examples.CheckUsernameEditText
as well as change RegisterExample.java
	private EditText etUsername;
	// change into
	private CheckUsernameEditText etUsername;
and
        etUsername = (EditText)findViewById(R.id.username);
	// change into
        etUsername = (CheckUsernameEditText)findViewById(R.id.username);
last but not least, we have to set and define the listener to our new CheckUsernameEditText widget.
        // Set our new Listener to the Username EditText view
        etUsername.setOnUsernameAvailableListener(new OnUsernameAvailableListener(){
			@Override
			public void onAvailableChecked(String username, boolean available) {
				// Handle the event here
				if(!available){
					etUsername.setTextColor(Color.RED);
					lblUserStatus.setText(username + " is already taken. Please choose another login name.");
				} else {
					etUsername.setTextColor(Color.GREEN);
					lblUserStatus.setText(username + " is available.");
				}
			}
        });
The onAvailableChecked will be called every time after the check was done. We can put our code here to handle the outcome. The above’s example is pretty easy and will just change the text color of the CheckUsernameTextEdit field and update the lblUserStatus label wo notify the user his desired name is available or not. That’s all. Congratulation to your first own listener implementation. Now we can run our application. If everything worked well, it should look like the screen shots below. Screen2 Screen5 Screen3 Screen4 As always, there is the full source of the files (click on expand to make it visible)

Main.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"
    >
	<TextView
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="Please enter your desired username"
	    />
	<TextView
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="Login:"
	    />
	<com.tseng.examples.CheckUsernameEditText
		android:id="@+id/username"
		android:singleLine="true"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<TextView
		android:id="@+id/userstatus"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    />
	<TextView
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="Password:"
	    />
	<EditText
		android:id="@+id/password"
		android:password="true"
		android:singleLine="true"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<TextView
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="Repeat your password:"
	    />
	<EditText
		android:id="@+id/password2"
		android:password="true"
		android:singleLine="true"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<Button
		android:id="@+id/register_button"
		android:text="Register"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<Button
		android:id="@+id/cancel_button"
		android:text="Cancel"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	/>
	<TextView
		android:id="@+id/result"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    />
</LinearLayout>

CheckUsernameEditText.java

package com.tseng.examples;

import com.tseng.examples.CheckUsernameEditText.OnUsernameAvailableListener;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class RegisterExample extends Activity {
	// Declare our Views, so we can access them later
	private CheckUsernameEditText etUsername;
	private EditText etPassword;
	private EditText etPassword2;
	private Button btnRegister;
	private Button btnCancel;
	private TextView lblUserStatus;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Set Activity Layout
        setContentView(R.layout.main);

        // Get the EditText and Button References
        etUsername = (CheckUsernameEditText)findViewById(R.id.username);
        etPassword = (EditText)findViewById(R.id.password);
        etPassword2 = (EditText)findViewById(R.id.password2);
        btnRegister = (Button)findViewById(R.id.register_button);
        btnCancel = (Button)findViewById(R.id.cancel_button);
        lblUserStatus = (TextView)findViewById(R.id.userstatus);

        // Set our new Listener to the Username EditText view
        etUsername.setOnUsernameAvailableListener(new OnUsernameAvailableListener(){
			@Override
			public void onAvailableChecked(String username, boolean available) {
				// Handle the event here
				if(!available){
					etUsername.setTextColor(Color.RED);
					lblUserStatus.setText(username + " is already taken. Please choose another login name.");
				} else {
					etUsername.setTextColor(Color.GREEN);
					lblUserStatus.setText(username + " is available.");
				}
			}
        });

        // Set Click Listener
        btnRegister.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// create Account
			}
		});
        btnCancel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// Close the application
				finish();
			}
		});
    }
}

RegisterExample.java

package com.tseng.examples;

import java.lang.reflect.Array;

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;

public class CheckUsernameEditText extends EditText implements OnKeyListener {
	OnUsernameAvailableListener onUsernameAvailableListener = null;
	final private static String[] registeredUsers = new String[] {
		// This is just a fixed List for tutorial purposes
		// in a real application you'd check this server sided or inside the database
		"tseng",
		"admin",
		"root",
		"joedoe",
		"john"
	};

	public CheckUsernameEditText(Context context) {
		super(context);
		// Set KeyListener to ourself
		this.setOnKeyListener(this);
	}
	public CheckUsernameEditText(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// Set KeyListener to ourself
		this.setOnKeyListener(this);
	}
	public CheckUsernameEditText(Context context, AttributeSet attrs) {
		super(context, attrs);
		// Set KeyListener to ourself
		this.setOnKeyListener(this);
	}

	// Allows the user to set an Listener and react to the event
	public void setOnUsernameAvailableListener(OnUsernameAvailableListener listener) {
		onUsernameAvailableListener = listener;
	}
	// This function is called after the check was complete
	private void OnUserChecked(String username, boolean available){
		// Check if the Listener was set, otherwise we'll get an Exception when we try to call it
		if(onUsernameAvailableListener!=null) {
			// Only trigger the event, when we have a username
			if(!TextUtils.isEmpty(username)){
				onUsernameAvailableListener.onAvailableChecked(username, available);
			}
		}
	}
	@Override
	public boolean onKey(View v, int keycode, KeyEvent keyevent) {
		// We only want to handle ACTION_UP events, when user releases a key
		if(keyevent.getAction()==KeyEvent.ACTION_DOWN)
			return false;

		boolean available = true;

		// Whenever a user press a key, check if the username is available
		String username = getText().toString().toLowerCase();
		if(!TextUtils.isEmpty(username)){
			// Only perform check, if we have anything inside the EditText box
			for(int i=0; i<registeredUsers.length; i++) {
				if(registeredUsers[i].equals(username)){
					available = false;
					// Finish the loop, as the name is already taken
					break;
				}
			}
			// Trigger the Event and notify the user of our widget
			OnUserChecked(username, available);
			return false;
		}
		return false;
	}
	// Define our custom Listener interface
	public interface OnUsernameAvailableListener {
		public abstract void onAvailableChecked(String username, boolean available);
	}
}
That’s all. I hope you enjoyed it. If you have any questions, post it in the comments.

Permanent link to this article: http://tseng-blog.nge-web.net/blog/2009/02/17/how-implement-your-own-listener-android-java/

45 comments

3 pings

Skip to comment form

  1. Patrik

    Could’nt you please provide the source code? I’m trying to create my own Listener for an TextEdit widget myself, but can’t get it to work. I think the full source can help me.

    Thanks

  2. Wojtek

    nice post, thanks :)

  3. Samuel

    Thanks, this helped me a lot :)

  4. Zak Guler

    I am new to mobile development and have enjoyed going over how to implement listeners but when I tried implementing how to create my own listener, somehow the code did not work. can you please post the whole source code to see where I went wrong.
    thanx,
    -Zak

  5. Hagai

    This tutorial is great for understanding how a listener works. The problem is that this method is not actually usable in real life apps as it opens listeners on the main thread of their containing class. Doing so defeats the purpose of using listeners altogether, as they are almost always used for asynchronous operations callbacks from the class that invokes them.

  6. bouss

    Thanks for this post, but I m sorry it doesn’t work, I tried it, the process is stopped.
    can you give us more details if possible,
    thank you again

  7. Rob Nugen

    Please note that at the very end of the article, the source code for RegisterExample.java and CheckUsernameEditText.java is reversed.

  8. LukCAD

    Thank you a lot. It is most full information how to create custom listener for Android in custom View i found even before.

  9. Ranjith

    Good post.. i need to know about URL listener in android would you help me in this regard

  10. Santi

    Nice post, thanks!
    Btw, is there any way to avoid “accidentally” double clicking on btnRegister, for example?
    I mean, if i click too fast on that screen button, the program fires twice the action defined in the onClick().
    Thanks in advance!

  11. fatal

    Thanks! Extremely useful!

  12. Mahendran

    FYI..
    The titles of
    RegisterExample.java
    CheckUsernameEditText.java

    switched . though not a problem just informing u. Nice post.. :)

  13. asaf

    are there any other problems with the source code?(other then the switch )
    i try to do this step by step and all so copy paste
    this not working for me
    useing eclipse
    and i get errors on all the @Override still even after removeing them sens they dont really do any thing
    this not working
    geting :
    fatal exception: main
    03-10 23:13:04.156: E/AndroidRuntime(539): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.tseng.examples/com.tseng.examples.RegisterExampleActivity}: java.lang.ClassNotFoundException: com.tseng.examples.RegisterExampleActivity
    ??

  14. Umesh

    Why do we need so many Constructers for CheckUserNameEditText???

  15. click here for

    I have got one idea for your webpage. It looks like there are a few cascading stylesheet issues while launching a number of webpages inside google chrome and safari. It is running alright in internet explorer. Probably you can double check this.

  16. S.Nilaxan

    Please sent this full source code to me, Now i’m trying to develop an Android apps
    this code is very much needed for me.

  17. zcode system review

    Thanks for finally writing about > How to implement your
    own Listener in Android/Java

  18. Soccer Dribbling Drills

    What’s up to all, the contents existing at this site are genuinely amazing for people experience, well, keep up the good work fellows.

  19. vin number lookup

    What you wrote made a ton of sense. However, consider this, what if
    you typed a catchier post title? I ain’t suggesting your information is not good, but what if you added a headline that grabbed folk’s attention?

    I mean How to implement your own Listener in Android/Java | Tseng’s dev blog is kinda vanilla. You might glance at Yahoo’s home page
    and note how they write article titles to get people to open
    the links. You might try adding a video or a related pic or two to grab readers interested about what you’ve got to say. Just my opinion, it might make your blog a little bit more interesting.

  20. The Pirate Bay

    All websites like these are real good and trustworthy options for the users to shift in the New
    Pirate Bay. Candle light vigils and protests were organized on
    Facebook and Twitter in support from the protestors, democracy
    and the end towards the bloodshed. OR that China counts for more than 34 percent coming from all current torrent connections
    to The Pirate Bay.

  21. home drug testing

    Hey I know this is off topic but I was wondering if you knew of any widgets I could add to my blog that automatically
    tweet my newest twitter updates. I’ve been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like this.
    Please let me know if you run into anything. I truly enjoy reading your blog and I look forward to your new updates.

  22. http://www.regetv.za.pl

    This piece of writing is in fact a fastidious one it helps new the web
    people, who are wishing for blogging.

  23. Hamish

    If you are going for finest contents like I do, simply pay a
    quick visit this web site daily as it offers feature contents, thanks

  24. Twila

    Awesome! Its in fact amazing piece of writing, I have got much clear idea regarding from this paragraph.

  25. Bernadine

    Hurrah, that’s what I was exploring for, what a information! present here at this web site, thanks admin of
    this site.

  26. Kimberley

    Whoa! This blog looks just like my old one! It’s on a entirely
    different topic but it has pretty much the same layout and design.
    Wonderful choice of colors!

  27. Maricela

    It’s hard to find your blog in google. I found it on 16 spot, you should build quality backlinks , it will help you to get more
    visitors. I know how to help you, just search in google – k2 seo tips and
    tricks

  28. Tatiana

    Finally i quit my regular job, now i earn decent money on-line you should try too, just type in google – bluehand roulette system

  29. www.superocasino.com

    Hello, yup this piece of writing is genuinely good and I have
    learned lot of things from it regarding blogging. thanks.

  30. Hader Roofing

    This is no small finahcial outlay and should be carefully considered and evaluated.
    The composition of this amazing flooring makes it so sturdy.
    3) What kind of customer guarantee does tthe home imlrovement company give.

    Here is my web blog – Hader Roofing

  31. gta 5 cheat kein fahndungslevel

    Nice post. I learn something totally new and challenging on blogs I stumbleupon on a daily basis.

    It’s always useful to read content from other writers and practice something from
    other sites.

  32. Tax estate law firm

    Fantastic beat ! I would like to apprentice while you amend your web site, how could i subscrobe for a blog site?

    The account helped me a acceptable deal. I had been tiny bit acquainted of
    this your broadcast offered bright clear idea

    Here is my homepage Tax estate law firm

  33. backpack reviews

    Lastly skin care and personal care products – this is where society sneaks
    in the chemicals. Thousands of people bought the
    wrong air purifiers every year and suffered the consequences.
    Blueair air purifiers were founded in Sweden in 1996.

  34. Halloween Greetings

    Make sure that you take time and decide on the best
    Halloween costume that will help you to portray a different you.
    Other characters from Monsters include Yeti, Randall
    Boggs and Claire. If you want to choose what attire to wear, you can select between creatures of the sea, the sea itself
    or someone who enjoys the sea.

  35. pest control Philadelphia

    Maintaining the health of your garden includes the repetitive
    tasks of weeding, clipping and applying pest control techniques.
    Finding ants crawling around the kitchen can be a little frustrating but finding evidence
    of more serious pests like mice, bedbugs or roaches can be overwhelming.
    One of the most effective strategies for eliminating earwigs is to encourage their natural predators
    to frequent the area around your home.

    Look at my blog post … pest control Philadelphia

  36. prostate support prostate

    Good day I am so grateful I found your blog page, I really found you by error, while I was looking on Google for something else, Anyhow I am
    here now and would just like to say thank you for a remarkable post
    and a all round thrilling blog (I also love the theme/design), I don’t have time to look over
    it all at the moment but I have saved it and also added your RSS feeds, so when I have time I will be back to read
    more, Please do keep up the great jo.

    Here is my blog … prostate support prostate

  37. http://www.warp7hosting.net

    So, people love to receive home decor items as gifts on Diwali.

    He will surely enjoy the gift and appreciate the time
    and energy you put into it. If you are creative in planning to surprise your husband, he,
    more than likely, will be quite pleased with the specialness of your effort regardless of the size of your gift.

  38. Wally

    Just desire to say your article is as amazing.
    The clearness in your post is simply spectacular and i can assume you’re an expert on this subject.
    Well with your permission let me to grab your feed to keep updated
    with forthcoming post. Thanks a million and please carry on the gratifying work.

  39. fu-ka.cc

    whoah this blog is great i really like reading your posts.
    Keep up the good work! You recognize, a lot of individuals are searching around
    for this info, you could help them greatly.

  40. linux hard drive recovery

    Hi there friends, its impressive paragraph concerning educationand completely explained,
    keep it up all the time.

  41. Catharine

    Also, you can compare other insurance coverage for different car models, which actually
    allows you to save time, money and energy.
    com and enter your zip code to compare auto insurance rates immediately.

    There a lot of companies offering affordable car insurance quotes over the
    phone and also via websites.

    Look at my page :: autoinsurance4me.org (Catharine)

  42. ricevere preventivi

    fantastic put up, very informative. I’m wondering why the
    other specialists of this sector do not understand this.

    You must continue your writing. I’m confident, you’ve a
    great readers’ base already!

  43. Violette

    Hi all, here every person is sharing these kinds of experience, so it’s pleasant to read
    this website, and I used to go to see this web site all the time.

  44. data recovery expert

    Thanks for sharing your thoughts about android. Regards

  45. Kids Tricycle With Push Handle

    Hi there, just became alert to your blog through Google,
    and found that it’s really informative. I am going to watch out for brussels.

    I’ll appreciate if you continue this in future.
    Many people will be benefited from your writing.
    Cheers!

  1. Tweets that mention How to implement your own Listener in Android/Java | Tseng's dev blog -- Topsy.com

    [...] This post was mentioned on Twitter by Shoaib Shaikh. Shoaib Shaikh said: your very own listeners [Droid] http://tseng-blog.nge-web.net/blog/2009/02/17/how-implement-your-own-listener-android-java/ [...]

  2. Cómo implementar nuestros Listener en Android | Sentido Droid

    [...] How to implement your own Listener in Android/Java [...]

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>