浏览 3364 次
锁定老帖子 主题:EditText 之内容监听器2
精华帖 (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! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |