我已经在Stackoverflow上阅读了很多帖子,说要在这样的参数中发送上下文或活动或AppCompatActivity这样的事情:
public class MainActivity extends AppCompatActivity {
public SecondClass secondClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
secondClass = new SecondClass(this);
}
public void updateView () {
Log.d("CS", "MainActivity updateView");
}
}
public class SecondClass {
public Context mContext;
public SecondClass (Context context) {
this.mContext = context;
this.mContext.updateView();
}
}
但那给了我错误:
"找不到符号方法updateView"
我做错了什么?
答案 0 :(得分:0)
因为Context
类没有名为updateView()
的方法。
你能做的是......
Naiive方法:
在活动中,将自己作为MainActivity
实例传递,然后您可以随时使用该实例调用updateView
方法。
推荐方法:使用相同的概念,但不要将自己作为已知的类实例传递给自己,而是将自己作为UpdateViewListener
传递给自己(这是一个你要做的界面),你基本上需要实现一个接口,我们称之为UpdateViewListener
并在UpdateViewListener
构造函数中将自己作为Second Class
传递给自己。
此接口应该有一个名为updateView()
的方法,因此实现此接口的任何类都需要为此方法提供一个实现,因此,在Second Class
中,您将不再关心listener
的内容。 1}},只要它实现UpdateViewListener
并且有一个名为updateView()
的方法,就将接口视为契约。
此模式称为Observer Pattern
。
有关详细信息,请参阅here
答案 1 :(得分:0)
不知道你的意图是什么,但是如果你正在调用MainActivity
方法,那么你需要一个MainActivity
(或者更好的是你应该将这些方法提取到接口)
public class SecondClass {
public MainActivity mActivity;
public SecondClass (MainActivity activity) {
this.mActivity = activity;
this.mActivity.updateView();
}
}
答案 2 :(得分:0)
因为,您正在将appCompatActivity类转发到Context。没有这种方法的上下文。如果你想做这个方法调用你必须使转换LIKE ((MainActivity)context).updateView()
否则你可以使接口像艾哈迈德阿什拉夫说。或者像Ashraf所说的那样将MainActivity实例传递给构造函数。