我正在使用动作栏兼容性库。我试图从一个带有openOptionsMenu()函数的按钮打开选项菜单,但它什么也没做。
按下手机上的菜单键时,菜单会像往常一样显示。这有什么不对?
public class ReadActivity extends ActionBarActivity {
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean value;
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.read, menu);
value = super.onCreateOptionsMenu(menu);
if (Helper.SupportsNewApi()) {
getActionBar().hide();
} else {
((View) ((LinearLayout) findViewById(R.id.actionbar_compat))
.getParent()).setVisibility(View.GONE);
}
return value;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
case R.id.menu_search:
// Toast.makeText(this, "Tapped search", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_bookmark:
// selectText();
// setFullScreen(false);
break;
case R.id.menu_day_night_mode:
break;
case R.id.menu_settings:
break;
case R.id.menu_zoom_in:
showOverlay(false);
break;
case R.id.menu_zoom_out:
showOverlay(false);
break;
case R.id.menu_table_of_contents:
Intent tocIntent = new Intent(this, TocActivity.class);
int GET_SECTION_REFERENCE = 1;
startActivityForResult(tocIntent, GET_SECTION_REFERENCE);
break;
case R.id.menu_overflow:
Toast.makeText(this, "Tapped overflow", Toast.LENGTH_SHORT).show();
//closeOptionsMenu();
openOptionsMenu(); //tried the below aswell, no results
//getWindow().openPanel(Window.FEATURE_OPTIONS_PANEL, null);
break;
}
return super.onOptionsItemSelected(item);
}
@Override //disable volume buttons
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (!menuShown && (keyCode == 25 || keyCode == 24)) {
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Log.d(tag, "Keycode is = "+keyCode);
if (keyCode == 82) {
if (!menuShown) {
//openOptionsMenu();
showOverlay(true);
} else {
showOverlay(false);
}
//don't want it to open when pressing menu
return true;
} else if (keyCode == 4 && menuShown) {
showOverlay(false);
return true;
} else if (keyCode == 25 && !menuShown) {
prevPage();
return true;
} else if (keyCode == 24 && !menuShown) {
nextPage();
return true;
}
return super.onKeyUp(keyCode, event);
}
}
答案 0 :(得分:32)
我遇到了同样的问题,试图在应用程序上绕过这个openOptionsMenu 我这样做应该在Android 1.6及更高版本上运行。根据Werner Van Belle的回答,我得出结论,我们可以找到解决问题的解决方法。 所以我提出了以下代码,当人们没有将方法标记为final时,它总是很美,所以我们总是可以覆盖它。如果您不想放弃将应用程序定位到最新的api(android:targetSdkVersion =“17”),这是完美的。我希望你们喜欢。 :)
@Override
public void openOptionsMenu() {
Configuration config = getResources().getConfiguration();
if((config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK)
> Configuration.SCREENLAYOUT_SIZE_LARGE) {
int originalScreenLayout = config.screenLayout;
config.screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE;
super.openOptionsMenu();
config.screenLayout = originalScreenLayout;
} else {
super.openOptionsMenu();
}
}
答案 1 :(得分:9)
通过谷歌揭示这一悲惨的发展。谷歌显然希望每个人都拥抱新的ActionBar。他们可以通过使ActionBar 比旧菜单系统更容易使用来实现这一目标。然而,这并不是他们计划过渡的方式。不,他们认为通过使旧菜单无法使用但没有提供适当的向后兼容性而对harras程序员有意义。
以下是从com.android.internal.policy.impl获取的代码,该代码应该创建optionsMenu面板。如您所见,代码只是拒绝创建选项Panel。尽管如此,这种能力显然存在。所以,回答你的问题:忘掉它,Google不再希望你再使用那个optionsPanel。
// Don't open an options panel for honeycomb apps on xlarge devices.
// (The app should be using an action bar for menu items.)
if (st.featureId == FEATURE_OPTIONS_PANEL) {
Context context = getContext();
Configuration config = context.getResources().getConfiguration();
boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
Configuration.SCREENLAYOUT_SIZE_XLARGE;
boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >=
android.os.Build.VERSION_CODES.HONEYCOMB;
if (isXLarge && isHoneycombApp) {
return;
}
}
答案 2 :(得分:4)
我无法理解强制阻止菜单按钮的使用情况。但是,以下技巧帮助我在“受限制”类型的设备上显示菜单。
首先,我们需要定义,是否需要以下黑客攻击。
boolean requireDirtyMenuButtonHack = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && (activity.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_XLARGE) > 0;
然后:
protected final OnClickListener mMenuButtonClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (requireDirtyMenuButtonHack) {
Configuration config = getContext().getResources().getConfiguration();
config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_XLARGE;
config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
getActivity().openOptionsMenu();
}
};
不要忘记清理! (不知道是否有必要,但最好还是玩)
public void onPrepareOptionsMenu(Menu menu) {
if (requireDirtyMenuButtonHack) {
Configuration config = getContext().getResources().getConfiguration();
config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_LARGE;
config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
//do the preparing...
}
答案 3 :(得分:3)
我不确定这是多么相关,但我发现的this论坛帖似乎回答了你的同一个问题。
我希望这篇文章足以解决您的问题。
祝你好运!答案 4 :(得分:2)
android:targetSdkVersion =“10”帮助了我。 openOptionsMenu()现在按预期在ICS +上运行。此外,屏幕底部出现“溢出”菜单按钮(在设备按钮面板上)。
ps:我使用NoTitleBar主题(对于sdk 11及更高版本的NoActionBar)+ Jake Wharton的ViewPagerIndicator。
答案 5 :(得分:2)
这对我有用,我的代码与你的代码非常相似,我想要做的是从操作栏中的按钮,打开溢出菜单:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_home_about:
dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.customdialog);
dialog.show();
break;
default:
case R.id.menu_home_refresh:
updateLists(true);
break;
case R.id.menu_home_menu:
new Handler().postDelayed(new Runnable() {
public void run() {
openOptionsMenu();
}
}, 0);
return true;
}
return false;
}
答案 6 :(得分:0)
你的意思是你想在动作栏的右侧显示一个按钮吗?
以下是我的做法:
RES /菜单/ main.xml中
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_share"
android:title="Logout"
android:icon="@android:drawable/ic_lock_power_off"
android:orderInCategory="1"
android:showAsAction="always" />
</menu>
活动
1)注意ActionBarActivity; 2)onCreateOptionsMenu中的MenuInflater 3)onOptionsItemsSelected(我认为你需要返回super.onOptionsItemSelected(item))
public class BaseActivity extends ActionBarActivity {
....
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}
....
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_share:
//Do something
break;
}
return super.onOptionsItemSelected(item);
}
答案 7 :(得分:0)
如果您使用自定义工具栏,可以尝试:
toolBar.showOverflowMenu();