有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

现在,每个按钮都从xml调用其相应活动中的函数。例如Button1onClick如下所示:

安卓:onClick="button1Clicked"

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

public void button1Clicked(View view) {
    UtilClass.button1Cliked();
}

我在UtilClass中设置了一个enum,以便在服务回调时知道更新哪个按钮(在ActivityAActivityB)。看起来是这样的:

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
}
...

我的问题是如何使用{}中的{}和{}中相同的{}来合并{}中的3buttonXClicked()函数?我在UtilClass中尝试的更改如下:

public static void buttonCliked(Button inButton) {
        buttonPressed = inButton;
        //call asynctask to tell the service inButton was pushed by passing
        //buttonPressed
}

但这不起作用,因为我不能在ActivityA或静态函数中使用非静态的enum来传递。但是我需要enum是非静态的,因为我需要在UtilClass中使用它

我是Android新手,所以如果我做错了什么,如果你能指出这一点,我将不胜感激

谢谢


共 (3) 个答案

  1. # 1 楼答案

    我不确定你所说的在一台设备上有活动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
      }
      

    在您的服务中,您将向所有活动广播单击的按钮,并在每个活动中处理来自服务的消息以更新其按钮状态

  2. # 2 楼答案

    静态方法的这些问题可能是O-O设计问题的证据。从快速阅读中,听起来好像你试图在一节课上做太多的事情,而且越来越混乱。一些想法:

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

    一般来说,如果你正在编写一个帮助类,比如^ {< CD2>}(尽管我怀疑这里确实是必要的),考虑把所有的东西都变成非静态的。

    <>要正确地存储状态,请考虑推荐的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;
        }
    }
    

    或类似的

  3. # 3 楼答案

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

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