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