android创建自己的监听接口
第一步:创建接口和方法
public interfaceOnUsernameAvailableListener {
public abstract voidonAvailableChecked(String username, boolean available); //使用abstract method 必须实现具体方法,在这里可以不适用抽象方法
}
第二步:定义变量保存listener
OnUsernameAvailableListeneronUsernameAvailableListener = null;
第三步:提供方法允许用户设置Listener
// Allows the userto set an Listener and react to the event
public voidsetOnUsernameAvailableListener(OnUsernameAvailableListener listener) {
onUsernameAvailableListener = listener;
}
第四步:提供方法允许用户获得Listener
public finalOnUsernameAvailableListener getOnUsernameAvailableListener() {
return onUsernameAvailableListener;
}
第五步:添加方法,此方法每次在监听事件被触发的时候调用
private voidOnUserChecked(String username, boolean available){
if(onUsernameAvailableListener!=null) {
if(myif = true){
onUsernameAvailableListener.onAvailableChecked(username,available);
}
}
}
完成。
附完整代码:
packagecom.tseng.examples;
importcom.tseng.examples.CheckUsernameEditText.OnUsernameAvailableListener;
importandroid.app.Activity;
importandroid.graphics.Color;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.TextView;
public classRegisterExample extends Activity {
// Declare our Views, so we can accessthem later
private CheckUsernameEditText etUsername;
private EditText etPassword;
private EditText etPassword2;
private Button btnRegister;
private Button btnCancel;
private TextView lblUserStatus;
/** Called when the activity is firstcreated. */
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// Set Activity Layout
setContentView(R.layout.main);
// Get the EditText and ButtonReferences
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 UsernameEditText view
etUsername.setOnUsernameAvailableListener(newOnUsernameAvailableListener(){
@Override
public voidonAvailableChecked(String username, boolean available) {
// Handle the eventhere
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(newOnClickListener() {
@Override
public void onClick(View v){
// create Account
}
});
btnCancel.setOnClickListener(newOnClickListener() {
@Override
public void onClick(View v){
// Close theapplication
finish();
}
});
}
}
packagecom.tseng.examples;
importjava.lang.reflect.Array;
import android.content.Context;
importandroid.text.TextUtils;
importandroid.util.AttributeSet;
importandroid.view.KeyEvent;
importandroid.view.View;
importandroid.view.View.OnKeyListener;
importandroid.widget.EditText;
importandroid.widget.TextView;
public classCheckUsernameEditText extends EditText implements OnKeyListener {
OnUsernameAvailableListeneronUsernameAvailableListener = null;
final private static String[]registeredUsers = new String[] {
// This is just a fixed List fortutorial purposes
//in a real application you'd check this server sided or inside the database
"tseng",
"admin",
"root",
"joedoe",
"john"
};
public CheckUsernameEditText(Contextcontext) {
super(context);
// Set KeyListener to ourself
this.setOnKeyListener(this);
}
public CheckUsernameEditText(Contextcontext, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// Set KeyListener to ourself
this.setOnKeyListener(this);
}
public CheckUsernameEditText(Contextcontext, AttributeSet attrs) {
super(context, attrs);
// Set KeyListener to ourself
this.setOnKeyListener(this);
}
// Allows the user to set an Listener andreact to the event
public voidsetOnUsernameAvailableListener(OnUsernameAvailableListener listener) {
onUsernameAvailableListener =listener;
}
//This function is called after the check was complete
privatevoid OnUserChecked(String username, boolean available){
//Check if the Listener was set, otherwise we'll get an Exception when we try tocall 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 handleACTION_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, ifwe have anything inside the EditText box
for(int i=0;i<registeredUsers.length; i++) {
if(registeredUsers[i].equals(username)){
available =false;
// Finish theloop, as the name is already taken
break;
}
}
// Trigger the Event and notify the user of our widget
OnUserChecked(username,available);
return false;
}
return false;
}
// Defineour custom Listener interface
publicinterface OnUsernameAvailableListener {
publicabstract void onAvailableChecked(String username, boolean available);
}
}