2015-07-10 100 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作为这些类的父类。