如何以静态和非静态方式使用枚举

时间:2012-10-22 21:46:56

标签: java android oop static enums

我有2项活动ActivityAActivityB,每项活动有3个按钮。我在一台连接的设备上显示ActivityA,在另一台连接的设备上显示ActivityB。每个按钮可以处于2种状态中的1种,但状态需要在两种设备上反映出来。我正在使用带有静态方法的util类来接收来自两个活动的按钮按下并将其发送到服务,以及在从服务回调时更新两个活动中按钮的状态。

现在,每个按钮都会从xml中调用相应活动中的函数。例如,Button1的{​​{1}}如下所示:

onClick

该函数(来自其相应的活动)调用UtilClass中的函数,如下所示:

android:onClick="button1Clicked"

我在public void button1Clicked(View view) { UtilClass.button1Cliked(); } 中设置了enum,因此我知道在服务回调时要更新哪个按钮(在UtilClassActivityA中)。它看起来像这样:

ActivityB

我的问题是,如何在public class UtilClass { public static Button buttonPressed = WfdOperationButton.NONE; public enum Button { BUTTON1, BUTTON2, BUTTON3 } public static void button1Cliked() { buttonPressed = Button.BUTTON1; //call asynctask to tell the service button1 was pushed by passing //buttonPressed } public static void button2Cliked() { buttonPressed = Button.BUTTON2; //call asynctask to tell the service button2 was pushed by passing //buttonPressed } ... enumUtilClass使用相同的ActivityA来合并ActivityB中的3个buttonXClicked()函数}?我在UtilClass的尝试更改如下:

UtilClass

这不起作用,因为我无法在静态函数中使用public static void buttonCliked(Button inButton) { buttonPressed = inButton; //call asynctask to tell the service inButton was pushed by passing //buttonPressed } enum中的非静态ActivityA来传入。但我需要枚举是非静态的,因为我需要在ActivityB中使用它。

我是Android的新手,所以如果我做错了什么,如果你指出它,我将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用片段而不是活动,并在包含它们的活动中使用您的类的单个实例。

另一种可能的方法是使您的类成为单例并使枚举实例成为类中的简单实例。

答案 1 :(得分:1)

静态方法的这些问题可能是O-O设计问题的证据。从快速阅读中可以看出,你在一堂课中试图做太多事情,而且它变得一团糟。一些想法:

为什么要在这里将Button枚举定义为嵌套类?您可以将其外部化(即移动到自己的文件),然后分享问题消失,假设我在这里理解你。

一般来说,如果你正在写一个像UtilClass这样的辅助类(尽管我怀疑这里有必要),考虑让所有东西都是非静态的。

要正确存储状态,请考虑推荐的Android方法之一。对于像这样的简单事情,Shared Preferences可能就足够了。如果您真的不想这样做,那么适当引用枚举的有状态singleton对象应该这样做。然后你的电话会是这样的:

public void button1Clicked(View view) {
    ButtonState.getInstance().setState(Button.Button1);
    // call wrapper for async call to say Button1 was pressed e.g.:
    serviceClient.sendButtonState(Button.Button1);
}

class ButtonState {
    private static ButtonState instance = new ButtonState();
    private Button state

    public ButtonState getInstance() {
        return instance;
    }

    public void setState(Button value) {
        state = value;
    }

    public Button getState() {
        return state;
    }
}

或类似。

答案 2 :(得分:0)

我不确定你的意思是你在一台设备上有活动A而在另一台设备上有活动B,但我会尽力回答它。

我猜你有一个服务正在运行以处理两个活动之间的通信(可能会或可能不会在同一个进程中运行),并且您正在尝试使状态与共享静态类保持同步。

而不是使用静态变量来跟踪变化,这就是我接近它的方式:

  1. 使用枚举保持Util类简单。

    public class UtilClass {
       public static enum Button {
          NONE, BUTTON1, BUTTON2, BUTTON3
       }
    
  2. 让您的每个活动按下自己的按钮并发送消息

    Button mClickedButton = Button.NONE;
    public void button1Clicked(View v) {
       mClickedButton = Button.BUTTON1;
       // send a message to service to tell which button was clicked
    }
    
  3. 在您的服务中,您会将点击的按钮广播到您的所有活动中,并且在您的每项活动中,您将处理来自服务的消息以更新其按钮状态。