我有3个具有相同功能的类。 H类是一个控制器类,所以我创建了一个setactivity类来获取调用它的活动的实例。现在我必须从控制器类H(非活动)调用当前初始化类的函数userleft()。
我得到的错误是#34;方法userleft()未定义类型Activity"我知道异常会到来,因为类Activity不包含一个名为userLeft()的方法。但是,使这项工作的最佳方法是什么?
请参阅下面的应用程序结构。
public class A extends Activity {
void onCreate(Bundle savedInstanceState) {
H.getInstance().setactivity(this);
}
public void userleft() {
}
}
public class B extends Activity {
void onCreate(Bundle savedInstanceState) {
H.getInstance().setactivity(this);
}
public void userleft() {
}
}
public class C extends Activity {
void onCreate(Bundle savedInstanceState) {
H.getInstance().setactivity(this);
}
public void userleft() {
}
}
我有另一个非活动类
public class H {
public static H getInstance() {
if (instance == null) {
instance = new H();
}
return instance;
}
public void setActivity(Activity activity) {
this.activityGame = activity;
}
public void randomCallBack(){
activityGame.userleft();
}
}
谢谢!
答案 0 :(得分:3)
您需要重新设计您的课程,如下所示
声明基本活动类
public abstract class BaseActivity extends Activity {
public abstract void userleft();
}
并声明你的课程
public class A extends BaseActivity {
void onCreate(Bundle savedInstanceState) {
H.getInstance().setactivity(this);
}
@Override
public void userleft() {
}
}
现在修改您的非活动类,如
public class H {
public static H getInstance() {
if (instance == null) {
instance = new H();
}
return instance;
}
public void setActivity(BaseActivity activity) {
this.activityGame = activity;
}
public void randomCallBack(){
activityGame.userleft();
}
}
现在,您可以为任何子类活动调用您的方法。
答案 1 :(得分:1)
在randomCallBack()方法中有一个Activity对象,Activity类不包含一个名为userLeft()的方法,所以你得到这样的例外是正常的。因此,您有两种方法可以解决此问题:
或者,您将activityGame转换为其对应的类:
public void randomCallBack(){
if (activityGame instanceof A) {
((A)activityGame).userleft();
}
if (activityGame instanceof B) {
((B)activityGame).userleft();
}
if (activityGame instanceof C) {
((C)activityGame).userleft();
}
}
或者,以更好的方式,您创建一个接口,由您的clasess A,B和C实现,并由H类使用。像这样:
public interface UserLeft {
public void userleft();
}
public class A extends Activity implements UserLeft {
void onCreate(Bundle savedInstanceState) {
H.getInstance().setactivity(this);
}
public void userleft() {
}
}
public class B extends Activity implements UserLeft {
void onCreate(Bundle savedInstanceState) {
H.getInstance().setactivity(this);
}
public void userleft() {
}
}
public class C extends Activity implements UserLeft {
void onCreate(Bundle savedInstanceState) {
H.getInstance().setactivity(this);
}
public void userleft() {
}
}
public class H {
UserLeft activity;
public static H getInstance() {
if (instance == null) {
instance = new H();
}
return instance;
}
public void setActivity(UserLeft activity) {
this.activityGame = activity;
}
public void randomCallBack(){
activityGame.userleft();
}
}
答案 2 :(得分:0)
您原谅了您的实例变量声明:) private Activity activityGame = null;
当然,课程 Activity 没有名为userleft()
的方法
您需要强制您的变量activityGame
到您的特定类:
public class H {
private Activity activityGame = null;
public static H getInstance() {
if (instance == null) {
instance = new H();
}
return instance;
}
public void setActivity(Activity activity) {
this.activityGame = (<CAST TO YOUR CLASS>) activity;
}
public void randomCallBack(){
activityGame.userleft();
}
}
修改强>
请试试这个:
public void setActivity(Activity activity) {
this.activityGame = (activity.getClass()) activity;
}
答案 3 :(得分:0)
Activity类没有userleft方法,因此您无法通过引用活动调用该方法。您可以使用userleft方法定义一个BaseActivity作为这些类的父类。