4

バーにメニュー項目のあるアクションバーがあります。更新アイコンをクリックすると、進行状況バーを表示する方法があります。

このアクティビティのオンロードを行いたいと思います。したがって、更新アイコン項目のクリックをプログラムで呼び出してみました。

onOptionsItemSelected(menu.findItem(R.id.action_Refresh)); 

メニューを作成した後、上記を呼び出しています。

しかし、これにより、データのロード時にヌルポインター例外が発生します。更新ボタンをクリックすると正常に動作しますが、プログラムで呼び出すとエラーが発生します。

ここに私が持っているものがあります:

 @Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    this.optionsMenu = menu;
    getMenuInflater().inflate(R.menu.main, menu);

    onOptionsItemSelected(menu.findItem(R.id.action_Refresh));

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    switch (item.getItemId()) 
    {
    case R.id.action_about:
        aboutapp();
        return true;

    case R.id.action_Refresh:
        Log.e("REfressh","Clicked");
        Mapsthree.refreshValue = 0;
        timer = new Timer();
        timerMethod();
        setRefreshActionButtonState(true);
        displayView(1);
        return true;

    default:
        return super.onOptionsItemSelected(item);
    }
}

private void timerMethod()
{
    timer.scheduleAtFixedRate(new TimerTask() 
    {
        @Override
        public void run() 
        {
            updateProgressBar();
        }

    }, 0, 800);
}

private void updateProgressBar() 
{
    runOnUiThread(new Runnable() 
    {
        public void run() 
        {
            if (Maps.refreshValue == 1)
            {
                setRefreshActionButtonState(false);
                timer.purge();
                timer.cancel();
            }
        }
    });
}

public void setRefreshActionButtonState(final boolean refreshing) 
{
    if (optionsMenu != null) 
    {
        final MenuItem refreshItem = optionsMenu.findItem(R.id.action_Refresh);
        if (refreshItem != null) 
        {
            if (refreshing) 
            {
                refreshItem.setActionView(R.layout.actionbar_indeterminate_progress);
            } 
            else 
            {
                refreshItem.setActionView(null);
            }
        }
    }
}

メニュー項目をプログラムで呼び出すことはできますか? もしそうならどのように?

ありがとう!

4

4 に答える 4

6

やるだけfindViewById(R.id.action_Refresh).callOnClick();

また

findViewById(R.id.action_Refresh).performClick();

于 2014-09-24T11:19:49.430 に答える
2

あなたはこれを試すことができます:あなたのActivity内
のMenuクラスの参照をここで取得してください:opMenu

Menu opMenu;
@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    opMenu= menu;
    getMenuInflater().inflate(R.menu.main, menu);

    onOptionsItemSelected(opMenu.findItem(R.id.action_Refresh));

    return super.onCreateOptionsMenu(menu);;
}  

opMenu.findItem()クリックのトリガーに使用

于 2014-09-24T11:39:04.043 に答える
2

なぜあなたはそれをから呼んでいonCreateOptionsMenuますか?

要件に応じて、onCreateまたはメソッドにロードするためのコードを記述できます。onResume

@Override
protected void onCreate(Bundle arg0) {

    super.onCreate(arg0);

    //whatever you are doing

    //now code for refresh

    Log.e("REfressh","First time");
    Mapsthree.refreshValue = 0;
    timer = new Timer();
    timerMethod();
    setRefreshActionButtonState(true);
    displayView(1);
}
于 2014-09-24T11:17:28.213 に答える
0
// check is assignable to menu item implementation
if(menuItem !=null 
    && MenuItemImpl.class.isAssignableFrom(menuItem.getClass())){
  // if so cast 
  MenuItemImpl impl = (MenuItemImpl)menuItem;
  // invoke listener 
  impl.invoke();
}

これは実装と同じです。

public boolean invoke() {
    if (mClickListener != null && mClickListener.onMenuItemClick(this)) {
        return true;
    }

    if (mIntent != null) {
        mContext.startActivity(mIntent);
        return true;
    }
    return false;
}

いつでも反射を使用できます:)

于 2016-11-04T20:20:45.053 に答える