2

2 つのアクティビティがActivityAありActivityB、それぞれに 3 つのボタンがあります。ActivityA接続されている 1 つのデバイスと、接続されている別のデバイスに表示ActivityBされます。ボタンはそれぞれ 2 つの状態のいずれかになりますが、状態は両方のデバイスに反映される必要があります。静的メソッドを持つ util クラスを使用して、両方のアクティビティからボタンの押下を受け取り、それをサービスに送信し、サービスからのコールバック時に両方のアクティビティのボタンの状態を更新しています。

現在、各ボタンは対応するアクティビティの関数を xml から呼び出します。たとえば、は次Button1onClickようになります。

android:onClick="button1Clicked"

その関数は (対応するアクティビティから) UtilClass の関数を呼び出し、次のようになります。

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

を設定しenumたので、サービスからのコールバック時に( と の両方で)UtilClassどのボタンを更新するかがわかります。次のようになります。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
}
...

私の質問は、 で同じものを使用し、 で 3 つの機能を統合するにはどうenumすれUtilClassActivityAよいですActivityBか? 私が試みた変更は以下のとおりです。buttonXClicked()UtilClassUtilClass

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

enumただし、静的関数内ActivityAまたはActivityB静的関数内で非静的を使用して渡すことができないため、これは機能しませんUtilClass

Android初心者なので間違っていたら指摘していただけると助かります。

ありがとう!

4

3 に答える 3

1

アクティビティの代わりにフラグメントを使用し、それらを含むアクティビティ内でクラスの単一のインスタンスを使用できます。

別の可能な方法は、クラスをシングルトンにし、列挙型インスタンスをクラス内の単純なインスタンスにすることです。

于 2012-10-22T22:00:51.003 に答える
1

静的メソッドに関するこれらの問題は、おそらく OO 設計の問題の証拠です。ざっと読んだだけでは、1 つのクラスであまりにも多くのことをしようとしているように思えます。いくつかのアイデア:

Buttonここで列挙型をネストされたクラスとして定義するのはなぜですか? あなたはそれを外部化することができます (つまり、独自のファイルに移動します)。その後、私がここであなたを理解していると仮定すると、共有の問題はなくなります。

一般に、次のようなヘルパー クラスを作成する場合UtilClass(実際に必要かどうかは疑問ですが)、すべてを非静的にすることを検討してください。

状態を適切に保存するには、推奨される Android メソッドのいずれかを検討してください。このような単純なことについては、Shared Preferencesで十分かもしれません。本当にそれをしたくない場合は、列挙型を適切に参照するステートフルなシングルトンオブジェクトで実行する必要があります。次に、呼び出しは次のようになります。

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があるとはどういう意味かわかりませんが、できる限り答えようと思います。

2つのアクティビティ(同じプロセスで実行される場合とされない場合があります)間の通信を処理するサービスが実行されており、共有静的クラスと状態を同期させようとしていると思います。

静的変数を使用して変更を追跡する代わりに、これが私がそれにアプローチする方法です:

  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 に答える