0

複数の実行中のアクティビティがあるとしましょう。A、B、および C。それぞれが同様のオプションメニューを共有しますが、実行にいくつかの違いがあります (「開始」オプションは、アクティビティ A と B でわずかに異なる場合があります)。また、アクティビティ A に関連付けられている「values」という静的クラスもあります。これには、現在実行中のアクティビティのコンテキストもあります。

値は、現在実行中のアクティビティの optionsmenu の項目を呼び出す場合があります。私のコードはごちゃごちゃしているので(以下を参照)、より読みやすい形式に整理したいと思います。

私の目標は、そのアクティビティの optionmenu 項目ではなく、現在実行中のアクティビティの関数だけを呼び出せるように値を設定することです。アクティビティ内では、optionsmenu の項目は、内部のコードではなく関数を呼び出すだけです (構成上の理由から)。

現在実行中のアクティビティの optionsmenu の項目を呼び出す values.class のサンプルです。

public void startExample() {
        Runnable startRun = new Runnable() {
            @Override
            public void run() {

                handler.post(new Runnable() { // This thread runs in the
                                                // UI
                    @Override
                    public void run() {
                        ((Activity) getCurrentContext()).openOptionsMenu();
                        ((Activity) getCurrentContext()).closeOptionsMenu();
                        ((Activity) getCurrentContext()).onOptionsItemSelected(theMenu.findItem(R.id.start));
                    }
                });
            }
        };
        new Thread(startRun).start();
}

ご覧のとおり、values.startExample() は、現在実行中のアクティビティのオプション メニューの開始項目を呼び出します。代わりに、現在実行中のアクティビティに基づいて関数を呼び出すように、これを変更したいと思います。だから、代わりにこういうことができるんじゃないかと思っていたんです。

values.class 内

ActivityB b = new ActivityB
public void startExample() {
    Runnable startRun = new Runnable() {
        @Override
        public void run() {

            handler.post(new Runnable() { // This thread runs in the
                                            // UI
                   @Override
                public void run() {
                    if( ((Activity) getCurrentContext()).getClass().getName().equals("package.ActivityB") ) {
                     b.start();
                    }
                }
            });
        }
    };
    new Thread(startRun).start();
}

アクティビティ B は次のようになります。

public class ActivityB extends Activity {
//class code here

@Override
 public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
               case start:
                    this.start();
                    break;

        }

  }
  public void start() {
       //code here
  }
}

これは可能ですか?この質問はわかりにくいかもしれませんので、質問してください。もう一度簡単にできるかもしれません。

4

1 に答える 1

1

いやいやいやいやいや。これは、バールをAndroidに引っ張って、それを粉々に砕くようなものです。アクティビティは、を介してインスタンス化されることを意図したものではありませんnew

異なるアクティビティがonOptionsItemSelected()で呼び出すメソッド間で共有動作が必要な場合は、特定のサブクラスに必要な動作を追加する前に、スーパーアクティビティを作成してスーパーを呼び出すか、作成します。変更されないものを含み、次に変更されるものをサブクラス内に追加する、すべてのアクティビティにアクセス可能な関数。いずれにせよ、Activitiesは、startActivityなどでクラスへの参照を提供することで実行されることを意図しています。Activityはライフサイクルが慎重に管理されているため、通常のJavaオブジェクトのように扱うことはできません(最終的にはそうですが)。システム。

于 2012-11-27T23:11:43.673 に答える