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
参照では、click
、trigger
などのようなものは提供されません。
また、私はAndroid開発に不慣れで、PHP/JavaScriptのバックグラウンドから来ているので、このレベルのJava OOPは私にとってまったく新しいものです。
次のように、メソッドperformIdentifierActionを使用します。
menu.performIdentifierAction(R.id.action_restart, 0);
パラメーターとして必要な項目を使用して、リスナーを手動で呼び出す必要があります。
MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart);
onOptionsItemSelected(actionRestart);
私のソリューションもここで共有したいと思います。プログラムでメニュー項目をクリックしようとする代わりに、メニュー項目をクリックするための別のメソッドを作成し、メニュー項目をクリックする必要がある場所で呼び出します。 OnOptionsItemSelected
メソッドは次のようになります。ご覧のとおり、クリックロジックを別のメソッドに移動しました。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == Android.R.id.home) {
homeClicked();
}
return super.onOptionsItemSelected(item);
}
private void homeClicked(){
...
}
プログラムでメニュー項目をクリックする必要があるときはいつでもhomeClicked
を呼び出すことができます。
私の知る限り、SDKにはこれを可能にするメカニズムはありません。確かに、この種のことを行うのは標準的な習慣ではありません。
ロジックを可能な限り実際のUIから切り離すことをお勧めします。そうすることで、アクションをトリガーするクリックをシミュレートするためにneedingになりません。あなたはWeb開発者であるため、これは非常に簡単に理解できるはずです。
この場合、トーストを別のメソッド(または複数のメソッド)にリファクタリングし、メニュー項目がクリックされたときと、手動でトリガーしたいときに両方を呼び出します。
代替、findViewById()によって返されたMenuItemを取得し、そこにハンドラーに渡すことを試みることができます。しかし、それがうまくいくかどうかはわかりません。
最善の方法ではありませんが、
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);
グローバルメニューを作る
public Menu mMenu;
OnCreateOptionMenuをオーバーライドしながらメニューをmMenuに割り当てます
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
this.mMenu = menu;
return super.onCreateOptionsMenu(menu);
}
このような呼び出しイベント:
if(mMenu != null) {
MenuItem action = mMenu.findItem(R.id.action_restart);
if(action != null) {
onOptionsItemSelected(action);
}
}
上記のメニュー項目の例に従って:
_<item Android:id="@+id/action_restart" Android:title="Restart"
Android:orderInCategory="1" />
_
callOnClick()
メソッドを使用します。
_((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick();
_