Re: [问题] 怎么从不同的Activity中呼叫执行动作

楼主: givemepass (λ)   2014-11-14 00:37:38
※ 引述《laijimmy (JLKING)》之铭言:
: 我想请问,如果我想利用不同页面中的按钮,
: 点击后会跳到另一个页面并且执行其中某一项动作该怎么做??
: 求解!!感谢~
推 colleen110: intent传参数给新的activity判断 11/12 17:02
推 sweet00914: Bundle 11/12 17:11
推 givemepass: 写listener 11/12 17:59
推 xisland: setContentView 11/12 19:08
我是想从activityB里面的button点击后跳到activityA中执行移动画面到该地点,
我的activityA是一个google map v2的画面,这样也能用intent吗?该怎么做?
求解~谢谢~
实做简单的Listener
模拟你的需求
假设有AB 两个Activity 当B传送一段文字 A会即时更新
(B点击button A立即移动画面到该地点)
先宣告一个通知中心
public class NoticeCenter {
private static NoticeCenter mNoticeCenter;
private ArrayList<OnDataChangedListener> mOnDataChangedListener;
//singleton 确保只有一个实体
private NoticeCenter(){}
public static NoticeCenter getInstance(){
if(null == mNoticeCenter){
mNoticeCenter = new NoticeCenter();
mNoticeCenter.init();
}
return mNoticeCenter;
}
private void init(){
mOnDataChangedListener =
new ArrayList<OnDataChangedListener>();
}
//observe pattern
public interface OnDataChangedListener{
public void onDataChanged(String msg);
}
public void addOnDataChangedListener(OnDataChangedListener listener){
mOnDataChangedListener.add(listener);
}
public void removeOnDataChangedListener(OnDataChangedListener listener){
mOnDataChangedListener.remove(listener);
}
public void notifyDataChanged(String msg){
for(OnDataChangedListener listener : mOnDataChangedListener){
if(listener != null){
listener.onDataChanged(msg);
}
}
}
}
这个通知中心包含了两个模式
独体模式 跟 观察者模式
独体模式确保这个类别只会生成一个物件
观察者模式则是可以即时通知所有有注册的物件
怎么使用?
public class AActivity extends Activity {
private TextView msgTextView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a_activity);
msgTextView = (TextView) findViewById(R.id.msg);
button = (Button) findViewById(R.id.a_to_b_btn);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(AActivity.this,
BActivity.class);
startActivityForResult(intent, 0);
}
});
NoticeCenter.getInstance().addOnDataChangedListener(new
OnDataChangedListener() {
@Override
public void onDataChanged(String msg) {
msgTextView.setText(msg);
}
});
}
}
上面有两个事件
一个是Button按下去的事件 会传送到B activity
另外一个事件是对通知中心进行注册
那B activity做些什么
public class BActivity extends Activity {
private Button sendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b_activity);
sendBtn = (Button) findViewById(R.id.send_btn);
sendBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
NoticeCenter.getInstance()
.notifyDataChanged("msg from b");
finish();
}
});
}
}
只有一个Button事件 当Button按下去则会传送字串给有注册的物件
并且关闭这个Activity
这样就达到即时更新的效果
那有人就会说, startActivityForResult就可以做到这样的事情,
等它回来再把值塞TextView内。
没错!
但是它做不到同时多个画面或物件进行注册时, 达到同时通知的效果,
而且这个方法可以传任何物件, 不用实做序列化。
参考看看
程式码
http://uploadingit.com/file/he5h6xrimuhilqoq/SigletonAndObserveDemo.zip
作者: pkmilk   2014-11-15 12:19:00

Links booklink

Contact Us: admin [ a t ] ucptt.com