我想在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!");
}
});
}
答案 0 :(得分:0)
在您的Controller
课程中,您要创建MainActivity
的新实例,该实例不会初始化btn
和txt
。而是让您的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;
然后将您的方法getBtn
和getTextView
称为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
}