簡體   English   中英

從非活動類調用不同活動中的方法

[英]Call a method in different activities from a non-activity class

我有3個具有相同功能的類。 H類是控制器類,因此我制作了setactivity類來獲取調用它的活動的實例。 現在,我必須從非Activity的控制器類H調用當前初始化類的函數userleft()。

我得到的錯誤是“方法Activity類型未定義userleft()方法”,並且我知道會出現異常,因為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(); 
    }
}

謝謝!

您需要像下面這樣重新設計您的課程

聲明基礎活動課程

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

現在,您將可以為任何子類活動調用方法。

在您的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(); 
    }
}

或者,以更好的方式,創建一個接口,該接口由類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(); 
}
}

您忘記了實例變量聲明:) 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;
}

活動類沒有userleft方法,因此您不能通過參考活動來調用該方法。 您可以使用方法userleft定義一個BaseActivity作為這些類的父類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM