以编程方式显示操作栏溢出
Programmatically display actionbar overflow
我有一个带菜单的操作栏。当你点击按钮时,菜单就会出现,一切都很好。
<?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
看来我要做的事情应该很简单,但我可能只是在做一些愚蠢的事情。
EDIT 我实际上不想只显示 R.id.adv,我想显示整个菜单,所以应该是 findViewById(R.menu.menu_main)
,其中 menu_main
是定义上述 xml 的文件的名称。
findViewById
查看 activity 的视图层次结构,而不是菜单。您需要在创建菜单后立即获取所需的项目:
编辑:
不认为这是可能的,但它是。在 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+,但是我链接的答案具有较低 APIs 的解决方案。
我有一个带菜单的操作栏。当你点击按钮时,菜单就会出现,一切都很好。
<?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
看来我要做的事情应该很简单,但我可能只是在做一些愚蠢的事情。
EDIT 我实际上不想只显示 R.id.adv,我想显示整个菜单,所以应该是 findViewById(R.menu.menu_main)
,其中 menu_main
是定义上述 xml 的文件的名称。
findViewById
查看 activity 的视图层次结构,而不是菜单。您需要在创建菜单后立即获取所需的项目:
编辑:
不认为这是可能的,但它是。在 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+,但是我链接的答案具有较低 APIs 的解决方案。