论坛首页 移动开发技术论坛

EditText 之内容监听器2

浏览 3364 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-02-03   最后修改:2010-02-03

EditText 之内容监听

 

[功能]

以前写过通过 TextWatcher 监听 EditText 内容的改动 在知道那个之前 我都是通过 TextMonitor 监听其内容的更新 尽管现在其变得毫无意义 还是打算把之写下来

 

[原理]

* 2 个 thread:

写道
class TextUpdate extends Activity : 得到 EditText 的内容

class TextMonitor extends Service : 作为守护 负责监视 并返回EditText 的内容

 

 

* 原理

 

                       TextUpdate                TextMonitor
1.  Request                              <- 
2.  Reply                                   ->
3.  Notification                          <-




步骤:
1. TextMonitor 向 TextUpdate 发送 Message_Request 要求得到此刻 EditText 的内容

2. TextUpdate 收到 Message_Request 后 通过 EditText.getText() 得到此刻的字符串 并通过 Message_Reply 向 TextMonitor 发送 Broadcast

3. TextMonitor 在收到 Message_Reply 后 取出结果 并通过发送Broadcast 把结果通过 Message_Notification 返回结果

4. TextUpdat 在收到 Message_Notification  后 取出内容 然后刷新 TextView 内容

 

 

 

* 以上就是其全部原理

 

 

[代码 步骤]

 

1. 定义一些供 Broadcast & Message 用到的字符串

public class TextHelper {
	
	//broadcast definition
	public final static String Broadcast_Update = "Broadcast_Update";
	public final static String Broadcast_Monitor = "Broadcast_Monitor";
	
	//message definition
	public final static String Message_Request = "Message_Request";
	public final static String Message_Reply = "Message_Reply";
	public final static String Message_Notification = "Message_Notification";
}

 

 

 

2. 定义 TextMonitor 任务有:

写道
1. 发送 Message_Request

2. 发送 Message_Notification

3. 接收 Message_Reply

 

public void requestContent(){
		Intent i = new Intent(TextHelper.Broadcast_Update);
    	
    	Bundle b = new Bundle();
    	b.putString(TextHelper.Message_Request, "Hello!");
    	
    	i.putExtras(b);
    	sendBroadcast(i);
	}
	
	
	public void notificationContent(String s){
		Intent i = new Intent(TextHelper.Broadcast_Update);
    	
    	Bundle b = new Bundle();
    	b.putString(TextHelper.Message_Notification, s);
    	
    	i.putExtras(b);
    	sendBroadcast(i);
	}
	
	
	public class MonitorMessageListenerHelper extends BroadcastReceiver {
		Context context;
		
		MonitorMessageListenerHelper listener;
		//construct 
		public MonitorMessageListenerHelper(Context c){
			context = c;
			
			//to instance it
			listener = this;
		}
		
		public void registerAction(String action){
			IntentFilter filter = new IntentFilter();
			filter.addAction(action);
			
			context.registerReceiver(listener,filter);
		}
		
		@Override
		public void onReceive(Context arg0, Intent arg1) {
			// TODO Auto-generated method stub
			Bundle b = arg1.getExtras();
			
			if(b.containsKey(TextHelper.Message_Reply)){
				String string = b.getString(TextHelper.Message_Reply);
				
				if(! last.equals(string)){
					notificationContent(string);
					
					last = string;
				}
				
				requestContent();
			}
		}
		
	}

 

 

 

3. 定义 TextUpdate 任务有:

写道
1. 得到 EditText 的内容

2. 把得到的内容 在 TextView 中显示之


3. 把得到的字串 通过 Message_Reply 发送

4. 接收 Message_Request 后 得到目标内容

5. 接收 Message_Notification 并显示之

 

public String getContent(){
    	return edit.getText().toString();
    }
    
    
    public void displayContent(String s){
    	text.setText(s);
    }
    
    public void sendContent(String s){
    	Intent i = new Intent(TextHelper.Broadcast_Monitor);
    	
    	Bundle b = new Bundle();
    	b.putString(TextHelper.Message_Reply, s);
    	
    	i.putExtras(b);
    	sendBroadcast(i);
    }
    
    
    public class UpdateMessageListenerHelper extends BroadcastReceiver {
		Context context;
		
		UpdateMessageListenerHelper listener;
		//construct 
		public UpdateMessageListenerHelper(Context c){
			context = c;
			
			//to instance it
			listener = this;
		}
		
		public void registerAction(String action){
			IntentFilter filter = new IntentFilter();
			filter.addAction(action);
			
			context.registerReceiver(listener,filter);
		}
		
		@Override
		public void onReceive(Context arg0, Intent arg1) {
			// TODO Auto-generated method stub
			Bundle b = arg1.getExtras();
			
			if(b.containsKey(TextHelper.Message_Request)){
				sendContent(getContent());
			}
			else if(b.containsKey(TextHelper.Message_Notification)){
				String string = b.getString(TextHelper.Message_Notification);
				
				displayContent(string);
				
			}
		}
		
	}

 

 

 

 4. emulator 运行截图:

 

 

5. 其实程序不太完善 缺失下面功能:

* TextMonitor 会始终运行 即使 EditText 没有焦点 有时间再改下!

done!

论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics