EditText 之内容监听
[功能]
以前写过通过 TextWatcher 监听 EditText 内容的改动 在知道那个之前 我都是通过 TextMonitor 监听其内容的更新 尽管现在其变得毫无意义 还是打算把之写下来
[原理]
* 2 个 thread:
写道
class TextUpdate extends Activity : 得到 EditText 的内容
class TextMonitor extends Service : 作为守护 负责监视 并返回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
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 并显示之
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!