2012-10-22 79 views
2

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

现在,每个按钮都会在xml的相应活动中调用一个函数。例如Button1onClick看起来是这样的:

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

我的问题是如何使用从UtilClass相同enumActivityAActivityB巩固UtilClass 3个buttonXClicked()功能?在UtilClass我尝试的改变如下:

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

,这并不会工作,因为我不能使用非静态enumActivityA或静电功能ActivityB传中,但我需要的枚举。是非静态的,因为我需要在UtilClass中使用它。

我是Android新手,所以如果我做了其他任何错误,我会很感激,如果你指出。

谢谢!

+0

嗨,这个问题仍然标记为开放。请选择答案或必要时关闭...谢谢。 – declension

回答

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

或相似。

+0

我同意你的前两段。我不确定外部化是否必要,但现在我确实需要。谢谢。 你是什么意思“如果你正在写助手课程”?你指的是UtilClass? 当你提到SharePreferences时,你是在谈论保存哪个按钮被最后按下到SharedPreferences?即使UtilClass是静态的,我可以从UtilClass访问SharePreferences吗? 我不确定我是否理解单例方法。你能显示ButtonState吗? – Patrick

+0

是的 - 请参阅最新的答案。 – declension

1

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

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

+0

您可以使用我提供的示例名称或可能使用代码来说明您的示例吗? – Patrick

+0

我不明白。你想让我告诉你如何创建片段?只需检查它的教程。与其他话题不同,这并不是很难。 –

+0

我了解第二个建议。感谢那一个。对于第一个建议,我只是想了解更多细节。我认为你说的是​​ActivityA和ActivityB包含一个带有三个按钮的片段?我听说过并且阅读过有关在多个活动中使用同一个片段的问题,但我从来没有看到有人在两个活动中使用同一个片段实例。你能举一个例子吗? – Patrick

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 
    } 
    

而在你的服务,你会播放点击按钮,所有的活动,并在各的活动中,您将处理来自服务的消息以更新其按钮状态。

+0

我的意思是我有两个连接的设备,其中一个显示ActivityA,另一个显示ActivityB。 您会在我的问题中看到我在UtilClass中使用AsyncTask与服务进行通信,以避免ActivityA和ActivityB中的通信的代码重复。因此,您的方法会复制该代码。 – Patrick