如何将OnClickListener设置为除Activity类以外的其他类

时间:2014-08-25 13:23:04

标签: java android controller onclicklistener

我想在Controller类中运行我的OnClickListener而不是MainActivity类。下面是我编写的用于测试它的代码,但Android模拟器只是因为它打开而崩溃!

MainActivity类:

public class MainActivity extends Activity {
Button btn;
TextView txt;

Controller controll;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btn = (Button) findViewById(R.id.button1);
    txt = (Button) findViewById(R.id.textView1);

    controll = new Controller();
}

public Button getBtn(){
    return btn;
}

public TextView getTextView(){
    return txt;
}

控制器类:

public class Controller {
MainActivity main;
Button btn;
TextView txt;

public Controller(){
    this.main = new MainActivity();

    btn = main.getBtn();
    txt = main.getTextView();
}

public void listners(){
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            txt.setText("Yes, it worked!");
        }
    });
}

3 个答案:

答案 0 :(得分:0)

在您的Controller课程中,您要创建MainActivity的新实例,该实例不会初始化btntxt。而是让您的Controller班级收到MainActivity的参数:

public Controller(MainActivity activity){
    this.main = activity;

    btn = main.getBtn();
    txt = main.getTextView();
}

然后在实例化时将MainActivity的引用发送到Controller类:

controll = new Controller(this);

答案 1 :(得分:0)

你做错了。你不能像这样实例化一个Activity。如果你这样做,它的所有回调都不会被调用,那么它就没用了。

在您的情况下,您可以将活动的实例传递给Controller,然后执行您需要的操作。

controll = new Controller(this);

在您的控制器中:

public Controller (MainActivity activity);
this.activity = activity;

然后将您的方法getBtngetTextView称为activity.getBtn()

答案 2 :(得分:0)

请注意, MVC 意义上的Activity控制器。您希望拥有的(一个可以在任何UI事件中幸存的类)是 Model (类似MyCystomButton的类属于 View )。关于这个 Controller (= Activity)的坏消息是它在屏幕转动时重新创建,在其他一些不太明显的情况下重新创建。

您的代码

this.main = new MainActivity();

使用屏幕上的UI元素创建与无关的新活动,并且不调用其函数onCreate()。没有惊讶它的字段是空的。

我建议将指向ControllerThatDoesNotDie(实际上是 Model 的一部分)的指针作为静态引用(但请注意,Android可能会终止进程并且引用可能会变为null;如果是这样的话发生时,onCreate的Bundle参数不为null,而ControllerThatDoesNotDie.theInstance()将为null。

现在,让Activity将按钮事件转发到ControllerThatDoesNotDie:

void onMyButton(View v) {
    ControllerThatDoesNotDie.theInstance().onMyButton(v);
    // assuming that theInstance() never returns null, creating the instance if necessary
}