以编程方式显示操作栏溢出

时间:2015-01-14 18:16:10

标签: java android android-actionbar

我有一个带菜单的操作栏。当您单击按钮时,菜单会显示出来,并且一切都与世界相符。

<?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>

然而,我刚刚被告知我们有一个客户端,其设备有一些显示在当前菜单栏上的其他菜单栏,因此他们无法访问菜单。所以我在webview上添加了一个带有javascript接口的按钮,告诉我的Activity以编程方式显示菜单。我可以很好地到达那里,但我不能为我的生活找出如何显示菜单,就像按下菜单按钮一样。

我尝试过这样的事情:

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

看起来我想要做的事情应该是轻而易举的,但可能是因为我只是在做一些愚蠢的事情。

编辑我实际上并不想只显示R.id.adv,我想显示整个菜单,所以应该findViewById(R.menu.menu_main)代替,{{1 }}是定义上述xml的文件的名称。

1 个答案:

答案 0 :(得分:2)

findViewById查看活动的视图层次结构,而不是菜单。您需要在创建菜单后立即获取所需的项目:

修改

不认为这是可能的,但确实如此。在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的解决方案。