从非活动类

时间:2015-07-10 09:26:37

标签: java android

我有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(); 
    }
}

谢谢!

4 个答案:

答案 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作为这些类的父类。