web-dev-qa-db-ja.com

プログラムでAndroidのMenuItemをトリガー/クリックする方法は?

menu_main.xmlにこれらのメニュー項目があります

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    tools:context=".MainActivity">

    <item Android:id="@+id/action_restart" Android:title="Restart"
        Android:orderInCategory="1" />
    <item Android:id="@+id/action_clear" Android:title="Clear"
        Android:orderInCategory="2" />
    <item Android:id="@+id/action_update" Android:title="Update"
        Android:orderInCategory="3" />
    <item Android:id="@+id/action_about" Android:title="About"
        Android:orderInCategory="4" />
    <item Android:id="@+id/action_try_restart" Android:title="Try Restart"
        Android:orderInCategory="5" />
</menu>

そして、私はonOptionsItemSelectedメソッドにこれを持っています:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    if (id == R.id.action_restart) {
        Toast.makeText(MainActivity.this, "Restart...", Toast.LENGTH_LONG).show();
    }

    if (id == R.id.action_clear) {
        Toast.makeText(MainActivity.this, "Clear...", Toast.LENGTH_LONG).show();
    }

    if (id == R.id.action_update) {
        Toast.makeText(MainActivity.this, "Update...", Toast.LENGTH_LONG).show();
    }

    if (id == R.id.action_about) {
        Toast.makeText(MainActivity.this, "About...", Toast.LENGTH_LONG).show();
    }

    if(id == R.id.action_try_restart) {
        // how to click / trigger the "action_restart" from here?
    }

    return super.onOptionsItemSelected(item);
}

私は試しました:

MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart);
actionRestart; //

ただし、actionRestart参照では、clicktriggerなどのようなものは提供されません。

また、私はAndroid開発に不慣れで、PHP/JavaScriptのバックグラウンドから来ているので、このレベルのJava OOPは私にとってまったく新しいものです。

26
omerowitz

次のように、メソッドperformIdentifierActionを使用します。

menu.performIdentifierAction(R.id.action_restart, 0);
20
Simon

パラメーターとして必要な項目を使用して、リスナーを手動で呼び出す必要があります。

MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart);
onOptionsItemSelected(actionRestart);
16
VadymVL

私のソリューションもここで共有したいと思います。プログラムでメニュー項目をクリックしようとする代わりに、メニュー項目をクリックするための別のメソッドを作成し、メニュー項目をクリックする必要がある場所で呼び出します。 OnOptionsItemSelectedメソッドは次のようになります。ご覧のとおり、クリックロジックを別のメソッドに移動しました。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == Android.R.id.home) {
        homeClicked();
    }
    return super.onOptionsItemSelected(item);
}
private void homeClicked(){
    ...
}

プログラムでメニュー項目をクリックする必要があるときはいつでもhomeClickedを呼び出すことができます。

8

私の知る限り、SDKにはこれを可能にするメカニズムはありません。確かに、この種のことを行うのは標準的な習慣ではありません。

ロジックを可能な限り実際のUIから切り離すことをお勧めします。そうすることで、アクションをトリガーするクリックをシミュレートするためにneedingになりません。あなたはWeb開発者であるため、これは非常に簡単に理解できるはずです。

この場合、トーストを別のメソッド(または複数のメソッド)にリファクタリングし、メニュー項目がクリックされたときと、手動でトリガーしたいときに両方を呼び出します。

代替、findViewById()によって返されたMenuItemを取得し、そこにハンドラーに渡すことを試みることができます。しかし、それがうまくいくかどうかはわかりません。

8
Veselin Romić

最善の方法ではありませんが、

MenuItem item_your_choice;

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.your_menu, menu);
    item_your_choice = menu.findItem(R.id.item_your_choice);
    return super.onCreateOptionsMenu(menu);
}

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case item_your_choice:
           //do whatever you want
            break;
        }
   return super.onOptionsItemSelected(item);
}

任意のメソッドから呼び出すだけ

onOptionsItemSelected(item_you_choice);
5
Ajay Shrestha
  1. グローバルメニューを作る

    public Menu mMenu;
    
  2. OnCreateOptionMenuをオーバーライドしながらメニューをmMenuに割り当てます

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        this.mMenu = menu;
        return super.onCreateOptionsMenu(menu);
    }
    
  3. このような呼び出しイベント:

    if(mMenu != null) {
        MenuItem action = mMenu.findItem(R.id.action_restart);
    
        if(action != null) {
            onOptionsItemSelected(action);
        }
    }
    
2
DenVik

上記のメニュー項目の例に従って:

_<item Android:id="@+id/action_restart" Android:title="Restart"
        Android:orderInCategory="1" />
_

callOnClick()メソッドを使用します。

_((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick();
_
0
Matt