onOptionsItemSelected在使用actionLayout(SherlockActionBar)时未调用
在菜单项中使用actionLayout时,未调用onOptionsItemSelected方法。 我错过了什么,或者它是SherlockActionBar的已知问题?onOptionsItemSelected在使用actionLayout(SherlockActionBar)时未调用
活动
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.article, menu);
super.onCreateOptionsMenu(menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d(TAG, "onOptionsItemSelected()");
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.menu_item_comment:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
菜单
<item android:id="@+id/menu_item_comment"
android:showAsAction="ifRoom"
android:actionLayout="@layout/action_bar_comment_layout"/>
好,你必须设置onClickListener对actionLayout接收回调。我不喜欢这样写道:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.map_menu, menu);
for (int i = 0; i < menu.size(); i++) {
MenuItem item = menu.getItem(i);
if (item.getItemId() == R.id.menu_more) {
itemChooser = item.getActionView();
if (itemChooser != null) {
itemChooser.setOnClickListener(this);
}
}
}
return super.onCreateOptionsMenu(menu);
}
工作正常,谢谢。顺便说一句,你可以使用findItem而不是迭代所有菜单项 – user634545 2012-07-24 12:04:47
可以缩短为: public boolean onCreateOptionsMenu(Menu menu){ getSupportMenuInflater()。inflate(R.menu.map_menu,menu); menu.findItem(R.id.menu_more).getActionView()setOnClickListener(本)。 return super.onCreateOptionsMenu(menu); } – roflharrison 2014-01-16 09:32:07
您应该使用MenuItemCompat.getActionView(item)和actionbarcompat。 – Sver 2014-06-17 06:36:01
您应该使用MenuItemCompat.getActionView(菜单项);而不是item.getActionView();如果您正在开发旧版本。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
for (int i = 0; i< menu.size() ;i++) {
MenuItem menuItem = menu.getItem(i);
if (menuItem.getItemId() == R.id.add_item) {
View view = MenuItemCompat.getActionView(menuItem);
if (view != null) {
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ToDoActivity.class);
startActivity(intent);
}
});
}
}
}
return true;
}
你必须添加自己的OnClickListener
并明确调用onOptionsItemSelected
:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem awesomeMenuItem = menu.findItem(R.id.action_awesome);
View awesomeActionView = menuItem.getActionView();
awesomeActionView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onOptionsItemSelected(awesomeMenuItem));
}
});
}
P.S:不知道为什么它不开箱的工作。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.main, menu);
View view = menu.findItem(R.id.menu_item_comment).getActionView();
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
});
return true;
}
另外,(这是非常重要的我,所以其他的答案没有工作),你需要禁用的在动作设计所有视图(即action_bar_comment_layout.xml)可点击的选项:
android:clickable="false"
结合@Arun Kumar和@ Luten的答案,下面的方法将使实现通用。对于使用actionView的所有菜单项,我们setOnClickListener致电onOptionsItemSelected(item)。 通过这种方式,我们可以混合和匹配normal和actionLayout菜单项,而不用担心设置单个onClickListeners。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(menuResourceId(), menu);
for (int i = 0; i < menu.size(); i++) {
final MenuItem item = menu.getItem(i);
View actionView = MenuItemCompat.getActionView(item);
if (actionView != null) {
actionView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
onOptionsItemSelected(item);
}
});
}
}
super.onCreateOptionsMenu(menu, inflater);
}
非常好 - 谢谢!可悲的是,我们需要这样一个snipet,而框架本身并不包含它...... – 2017-11-13 21:44:22
'@ layout/action_bar_comment_layout'是怎么样的? – 2012-11-29 09:57:58