3

У меня есть панель действий с пунктом меню на панели. Когда я нажимаю на значок обновления, у меня есть метод, показывающий индикатор выполнения.Программный пункт меню действий пожарной панели в Android

Я хотел бы сделать это при загрузке этой деятельности. Следовательно, я попробовал называть элемент значка обновления, щелкая программно:

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

Я вызываю это после создания меню.

Но это дает исключение null-указателя для загрузки моих данных. Если я нажму кнопку «Обновить», он работает нормально, но если я его программным образом вызову, я получаю сообщение об ошибке.

Вот что у меня есть:

@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); 
      } 
     } 
    } 
} 

Можно ли вызвать пункт меню программно? если да, то как?

Спасибо!

+0

Wrap код, который вы выполнить для действия обновления в новом методе, а затем вызвать его для элемента действия и везде, где вам это нужно назвать в вашей деятельности. – fasteque

+0

проверить мой ответ –

ответ

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); 
} 
+0

Я не могу, я меняю значок обновления на progressbar только после его нажатия. – TheDevMan

+0

Итак, вы хотите, чтобы он был изменен на progressbar при первой загрузке? –

+0

Это правильно - потому что я загружаю несколько вещей из облака и занимаю время. – TheDevMan

6

Вобще findViewById(R.id.action_Refresh).callOnClick();

или

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

+0

Для этого требуется API 15 ... Я поддерживаю приложение из API 14. – TheDevMan

+0

Хорошо измените его на performClick() вместо. Простой. –

+0

Не работает. :( – TheDevMan

2

Вы можете попробовать это:
получить ссылку на класс меню 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(), чтобы вызвать нажмите

+0

Это именно то, что я пробовал. – TheDevMan

+0

@TheDevMan просто заменит ваш код моим и проверит, вы использовали 'menu.findItem()', я получаю правильный результат. –

+0

Я пробовал его с помощью метода, который работал, но я использую логику micro.pravi. Отлично работает с этим методом. Благодаря! Учитывая +1 для вашей логики, спасибо! – TheDevMan

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; 
} 

вы всегда можете использовать размышления :)

Смежные вопросы