2015-01-14 7 views
1

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

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:id="@+id/reload" 
     android:title="@string/reload" 
     android:alphabeticShortcut="r" 
     android:numericShortcut="1" 
     android:titleCondensed="Rload"></item> 

    <group android:id="@+id/adv" android:menuCategory="secondary"> 
     ...options 
    </group> 
</menu> 

Однако, я только что сказал, что у нас есть клиент, устройство которого имеет какое-то другой строку меню, которое отображается над текущим, так что они не могут получить доступ к меню. Поэтому я добавил кнопку в веб-браузере с помощью javascriptinterface, чтобы сообщить моей активности о программном отображении меню. Я могу получить там просто отлично, но я не могу на всю жизнь понять, как отобразить меню, как будто нажата кнопка меню.

Я пытался сделать что-то вроде этого:

private void showMenu() { 
    try{ 
     actionbar.show(); 
     MenuItem menu = (MenuItem) findViewById(R.id.adv); 
     menu.expandActionView(); 
    } 
    catch(Exception e){ 
     Log.e(LOG_CAT,"Unable to inflate menu"); 
    } 
} 

, но я получаю исключения нулевого указателя

java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.view.MenuItem.expandActionView()' on a null object reference 

Похоже, что я пытаюсь сделать, должно быть тривиально просто, но возможно, я просто делаю что-то безгласное.

EDIT Я на самом деле не хочу, чтобы просто показать R.id.adv, я хотел бы показать все меню, так что, вероятно, следует findViewById(R.menu.menu_main) вместо этого, где menu_main это имя файла, который выше XML определяется в.

ответ

2

findViewById выглядит в иерархии представления активности, а не в меню. Вы должны получить элементы, которые необходимо сразу же после того, как ваше меню создано:

Edit:

Не думаю, что это возможно, но это. С помощью this answer вот как вы можете это сделать:

View mOverflow; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final View decor = getWindow().getDecorView(); 
    decor.post(new Runnable() { 
     @Override 
     public void run() { 
      ArrayList<View> results = new ArrayList<>(); 
      decor.findViewsWithText(results, "OVERFLOW", 
        View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION); 

      if (results.size() == 1) { 
       mOverflow = results.get(0); 
      } 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

private void showMenu() { 
    actionbar.show(); 
    mOverflow.performClick(); 
} 

и в вашем styles.xml:

<style name="AppTheme" parent="android:Theme.Holo"> 
    <item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item> 
</style> 

<style name="Widget.ActionButton.Overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow"> 
    <item name="android:contentDescription">OVERFLOW</item> 
</style> 

findViewsWithText требует API 14+, однако ответ я связан, имеет решение для более низкого API.

+0

Это имеет смысл для меня, но menu.findItem (R.id.adv); по-прежнему возвращает нулевой объект. Глядя на объект в отладчике, кажется, что объект меню, который я получаю в onCreateOptionsMenu, на самом деле является объектом, который я хочу отобразить. –

+0

@ S.Buda Вы уверены, что 'showMenu' не вызывается до создания меню? – Simas

+0

Да. 'showMenu' вызывается только тогда, когда пользователь нажимает определенную кнопку, но' onCreateOptionsMenu' вызывается при запуске приложения. –

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