2

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

现在,每个按钮从 xml 调用其对应活动中的一个函数。例如看起来像这样Button1onClick

android:onClick="button1Clicked"

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

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

我设置了一个enumin ,因此我知道在服务回调时UtilClass要更新哪个按钮(在ActivityA和中)。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
}
...

我的问题是如何使用 in 中的相同enum功能UtilClassActivityA合并ActivityBin 中的 3 个buttonXClicked()功能UtilClass?我尝试的更改UtilClass如下:

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

这不起作用,因为我不能在静态函数enumActivityAActivityB静态函数中使用非静态来传递。但我需要枚举是非静态的,因为我需要在UtilClass.

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

谢谢!

4

3 回答 3

1

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

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

于 2012-10-22T22:00:51.003 回答
1

静态方法的这些问题可能是 OO 设计问题的证据。从快速阅读来看,听起来您在一个班级中尝试做太多事情,而且变得一团糟。一些想法:

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

一般来说,如果你正在编写一个像这样的辅助类UtilClass(尽管我怀疑这里是否真的有必要),请考虑使所有内容都成为非静态的。

要正确存储状态,请考虑推荐的 Android 方法之一。对于像这样的简单事情,共享首选项可能就足够了。如果您真的不想这样做,则应该使用适当引用枚举的有状态单例对象来执行此操作。然后你的电话看起来像:

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

或类似的。

于 2012-10-22T22:15:55.993 回答
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
    }
    

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

于 2012-10-22T22:16:46.953 回答