2015-07-10 96 views
1

我有3個具有相同功能的類。 H類是一個控制器類,所以我創建了一個setactivity類來獲取調用它的活動的實例。現在我不得不從控制器類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(); 
    } 
} 

謝謝!

回答

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

或者,以更好的方式,爲您打造一個接口,它是通過實施你的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(); 
} 
} 
+1

第二種方法完美運作。 –

+0

@SanjuSonyKurian那是我會用的那個。很高興它適合你! – crigore

0

您forgott您的實例變量聲明:) 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; 
} 
+1

調用此類的活動可能是3中的任何一個,它是隨機的。所以我無法將變量轉換爲一個特定的類,這基本上是問題。 :( –

+0

你基本上需要創建一個開關箱,我已經想過另一種方式,但目前評估 –

+0

請試試我的想法...不知道它是否工作雖然 –

3

你需要重新設計你的類像下面

Declaire基本活動類

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

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

0

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