读书人

想在Android上用一下PureMVC哪位高手

发布时间: 2012-07-02 17:46:22 作者: rapoo

想在Android上用一下PureMVC,谁知结果……

我想用PureMVC for Java实现这样一个Android程序:点击按钮,在两个EditText中显示一些内容和点击总次数。

于是,我开始写了(当然这是我最后修改的正常版):

?

res/layout/main.xml:

?

?

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <TextView        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="@string/hello" />    <EditText        android:id="@+id/editText1"        android:layout_width="match_parent"        android:layout_height="wrap_content"         android:editable="false">    </EditText>    <EditText        android:id="@+id/editText2"        android:textColor="#FF0000"        android:layout_width="match_parent"        android:layout_height="wrap_content"         android:editable="false">    </EditText>        <Button        android:id="@+id/button1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Button" /></LinearLayout>
?

表面类:

?

?

package com.iteye.weimingtom.pmvc.test;import org.puremvc.java.interfaces.IFacade;import org.puremvc.java.patterns.facade.Facade;import android.widget.EditText;public class MyFacade extends Facade implements IFacade {    public MyFacade() {        this.registerCommand(SetTextCommand.NAME, new SetTextCommand());          this.registerMediator(new TextMediator());          this.registerMediator(new SimpleTextMediator());         this.registerProxy(new MyProxy());    }        public void setupReceivers(EditText editText1, EditText editText2) {    ((TextMediator) this.retrieveMediator(TextMediator.NAME)).setEditText(editText1);    ((SimpleTextMediator) this.retrieveMediator(SimpleTextMediator.NAME)).setEditText(editText2);    }}
?

代理数据(共享数据)类:

?

?

?

package com.iteye.weimingtom.pmvc.test;import org.puremvc.java.interfaces.IProxy;import org.puremvc.java.patterns.proxy.Proxy;public class MyProxy extends Proxy implements IProxy {public static final String NAME = "MyProxy";public MyProxy() {super(NAME, null);}public int clickNum = 0;public int getClickNum() {return clickNum;}public void setClickNum(int clickNum) {this.clickNum = clickNum;}}

?

?

消息类:

?

?

package com.iteye.weimingtom.pmvc.test;import org.puremvc.java.interfaces.ICommand;import org.puremvc.java.interfaces.INotification;import org.puremvc.java.patterns.command.SimpleCommand;public class SetTextCommand extends SimpleCommand implements ICommand {public static final String NAME = "SET_TEXT_COMMAND";  @Override     public void execute(INotification n) {     MyProxy proxy = (MyProxy)this.facade.retrieveProxy(MyProxy.NAME);      proxy.setClickNum(proxy.getClickNum() + 1);      }}
?

中介类(有两个):

?

?

package com.iteye.weimingtom.pmvc.test;import org.puremvc.java.interfaces.IMediator;import org.puremvc.java.interfaces.INotification;import org.puremvc.java.patterns.mediator.Mediator;import android.widget.EditText;public class TextMediator extends Mediator implements IMediator {public final static String NAME = "TextMediator";private EditText editText;public TextMediator() {super(NAME, null);}public void setEditText(EditText editText) {this.editText = editText;}    @Override     public String[] listNotificationInterests() {          return new String[]{        SetTextCommand.NAME        };    }        @Override    public void handleNotification(INotification n) {        if (SetTextCommand.NAME.equals(n.getName())) {        if (this.editText != null) {         this.editText.setText(        "name:" + n.getName() + "\n" +         "body:" + n.getBody() + "\n" +         "proxy data: clickNum = " + ((MyProxy)this.facade.retrieveProxy(MyProxy.NAME)).getClickNum());        }        }    } }
?

?

?

package com.iteye.weimingtom.pmvc.test;import org.puremvc.java.interfaces.IMediator;import org.puremvc.java.interfaces.INotification;import org.puremvc.java.patterns.mediator.Mediator;import android.widget.EditText;public class SimpleTextMediator extends Mediator implements IMediator {public final static String NAME = "SimpleTextMediator";private EditText editText;public SimpleTextMediator() {super(NAME, null);}public void setEditText(EditText editText) {this.editText = editText;}    @Override     public String[] listNotificationInterests() {          return new String[]{        SetTextCommand.NAME        };    }        @Override    public void handleNotification(INotification n) {        if (SetTextCommand.NAME.equals(n.getName())) {        if (this.editText != null) {         this.editText.setText(        "clickNum = " + ((MyProxy)this.facade.retrieveProxy(MyProxy.NAME)).getClickNum());        }        }    } }
?

对接到界面后:

?

?

package com.iteye.weimingtom.pmvc.test;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class PureMVCTestActivity extends Activity {private MyFacade facade = new MyFacade();    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);            Button button1 = (Button) this.findViewById(R.id.button1);    EditText editText1 = (EditText) this.findViewById(R.id.editText1);    EditText editText2 = (EditText) this.findViewById(R.id.editText2);            facade.setupReceivers(editText1, editText2);                button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {facade.sendNotification(SetTextCommand.NAME, "button1, onClick");}        });    }}

?

?

最令我不解的是,如果直接把TextView引用传给registerMediator的TextMediator和SimpleTextMediator对象(作为它们的构造函数的参数),那么响应SetTextCommand的中介类所持有的TextView引用可能不是界面上的TextView引用,因为:

?

1. 在调试模式下,registerMediator传入的对象引用等于retrieveMediator得到的对象引用。

2. 在直接运行时,registerMediator传入的对象引用不等于retrieveMediator得到的对象引用。

?

所以,我用这种方式传递EditText引用。

?

    public MyFacade() {        this.registerCommand(SetTextCommand.NAME, new SetTextCommand());          this.registerMediator(new TextMediator());          this.registerMediator(new SimpleTextMediator());         this.registerProxy(new MyProxy());    }        public void setupReceivers(EditText editText1, EditText editText2) {    ((TextMediator) this.retrieveMediator(TextMediator.NAME)).setEditText(editText1);    ((SimpleTextMediator) this.retrieveMediator(SimpleTextMediator.NAME)).setEditText(editText2);    }

?

?

而非在注册时传入:

?

?

//这样写可能有问题    public MyFacade(EditText editText1, EditText editText2) {        this.registerCommand(SetTextCommand.NAME, new SetTextCommand());          this.registerMediator(new TextMediator(editText1));          this.registerMediator(new SimpleTextMediator(editText2));         this.registerProxy(new MyProxy());    }
?

?

?

?

读书人网 >Android

热点推荐