2016-02-26 2 views
4

Я использую MaterialShowcaseView, чтобы показать пользователю быстрый учебник при первом запуске приложения.Android получить ссылку на элемент действия?

Проблема, с которой я столкнулась, заключается в том, что я могу получить ссылку на объекты в элементах панели действий, когда пользователь выбирает этот элемент в onOptionsItemSelected.

т.е.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.my_location: 
      // User chose the "Favorite" action, mark the current item 
      // as a favorite... 
      ShowcaseConfig config = new ShowcaseConfig(); 
      config.setDelay(500); // half second between each showcase view 


      MaterialShowcaseSequence sequence = new MaterialShowcaseSequence(this, SHOWCASE_ID); 

      sequence.setConfig(config); 

      sequence.addSequenceItem(findViewById(R.id.action_my_location), 
        "This is button one", "GOT IT"); 
      sequence.start(); 
      Toast.makeText(MapsActivity.this, "My location action press", Toast.LENGTH_SHORT).show(); 

      return true; 

     default: 
      // If we got here, the user's action was not recognized. 
      // Invoke the superclass to handle it. 
      return super.onOptionsItemSelected(item); 
    } 
} 

Приведенный выше код работает.

Можно ли получить ссылку на просмотр в onCreateOptionsMenu? Все, что я пробовал, дает мне ссылку на нулевой объект для представления.

Я пробовал this answer тоже, без успеха.

Следует отметить, что для actionBar я использовал android's action bar tutorial.

Спасибо, ребята.

EDIT:

Это то, что я пытался сделать сейчас:

@Override 
    public void invalidateOptionsMenu() { 
     super.invalidateOptionsMenu(); 

    } 
    MenuItem mi; 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     mi = menu.findItem(R.id.action_my_location); 
     new MaterialShowcaseView.Builder(this) 
       .setTarget(mi.getActionView()) 
       .setDismissText("GOT IT") 
       .setContentText("This is some amazing feature you should know about") 
       .setDelay(300) // optional but starting animations immediately in onCreate can make them choppy 
       .singleUse("101010110") // provide a unique ID used to ensure it is only shown once 
       .show(); 
     return super.onPrepareOptionsMenu(menu); 
} 

Ошибка:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.getLocationInWindow(int[])' on a null object reference

+0

Пожалуйста, проверьте, является ли ваш пункт меню остается пустой внутри' onPrepareOptionsMenu '? Также вставьте номер строки, где возникло исключение –

+0

Исключение происходит в .setTarget (mi.getActionView()). и Меню не равно нулю. – Adz

+0

Проверьте мое изменение в моем ответе. Я дал код о том, как библиотека предлагает использовать его на элементах actiobar. –

ответ

4

Вы можете сделать menu.findItem(R.id.youritemid), чтобы получить пункт меню, и вы можете получить ссылку на объект меню в вашем методе onCreateOptionsMenu(Menu menu), тогда вы можете инициализировать глобальную переменную с помощью этого объекта меню, чтобы использовать его в любом месте.

Вот код:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // TODO Auto-generate d method stub 
    getMenuInflater().inflate(R.menu.main, menu); 
    _menu = menu; 
    return true; 
} 

Я инициализировать свою глобальную переменную Menu _menu; с объектом меню, а затем я могу сделать, как этот MenuItem mi = _menu.findItem(R.id.itemid); где-либо я хочу.

Edit: Пожалуйста, будьте осторожны, чтобы не вызывая ничего на MenuItem до меню будет создаваться, вы можете запланировать поток ждать 3 до 5 секунд, или вы можете сделать это какой-то другой путь, все, что вы должны беспокоиться о том, было ли инициализировано меню или нет.

+0

Привет, вы можете показать мне, d: – Adz

+0

Я добавил код –

+0

Я получаю ссылку на нулевой объект на _menu.findItem (R.id.my_item); – Adz

0

Вам нужен этот класс:

public class ToolbarActionItemTarget implements Target { 

private final Toolbar toolbar; 
private final int menuItemId; 

public ToolbarActionItemTarget(Toolbar toolbar, @IdRes int itemId) { 
    this.toolbar = toolbar; 
    this.menuItemId = itemId; 
} 

@Override 
public Point getPoint() { 
    return new ViewTarget(toolbar.findViewById(menuItemId)).getPoint(); 
} 

Итак:

showcaseView = new ShowcaseView.Builder(getActivity()) 
      .setTarget(Target.NONE) 
      .setTarget(new ToolbarActionItemTarget(toolbar, R.id.action_view)) 

ссылающегося на: https://github.com/amlcurran/ShowcaseView/releases/tag/5.3.0

`

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