我有这样定义的MenuItem:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_starred"
android:icon="@drawable/btn_star"
android:title="@string/description_star"
android:checkable="true"
android:checked="true"
android:orderInCategory="1"
android:showAsAction="always" />
</menu>
Run Code Online (Sandbox Code Playgroud)
并以btn_star.xml这种方式定义:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_checked="false"
android:drawable="@drawable/btn_star_off_normal" />
<item
android:state_checked="true"
android:drawable="@drawable/btn_star_on_normal" />
</selector>
Run Code Online (Sandbox Code Playgroud)
当我创建使用此选项菜单,但是,图标永远不会在其选中的状态显示,即使MenuItem的isChecked()属性为true.
我正在使用ActionBarSherlock控件,但是,如果我只是创建一个普通的选项菜单并调用,我得到相同的结果setChecked(true).btn_star_off无论项目的检查状态如何,它仍然显示drawable.
onOptionsItemSelected()正确调用该方法,我可以成功更改checked属性:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.isCheckable()) {
item.setChecked(!item.isChecked());
}
return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)
在此处设置断点会显示isChecked属性已更改,但图标本身未更新以反映正确的状态.
这里有什么我想念的吗?我做错了吗?我无法弄清楚为什么这不能正常工作.
我有一个Android应用程序,其中一个活动中包含以下菜单项(涉及处理名称和mac编号列表):
<item android:id="@+id/menu_sort_tagg"
android:icon="@android:drawable/ic_menu_sort_by_size"
android:title="@string/menu_sort_list" >
<menu>
<group android:checkableBehavior="single">
<item android:id="@+id/sort_by_name"
android:title="@string/sort_by_name" />
<item android:id="@+id/sort_by_mac"
android:title="@string/sort_by_mac" />
</menu>
</item>
Run Code Online (Sandbox Code Playgroud)
当应用程序状态发生变化时,我希望能够使用以下代码预先检查上次使用的排序选项列表中的哪个项目:
((MenuItem)findViewById(R.id.sort_by_name)).setChecked(true);
Run Code Online (Sandbox Code Playgroud)
问题是这个特定的行给了我一个运行时异常.有没有人知道为什么?
查看日志会发现运行时异常是由空指针异常触发的.通过这种方式更改代码:
MenuItem mi = (MenuItem)findViewById(R.id.sort_by_name);
mi.setChecked(true);
Run Code Online (Sandbox Code Playgroud)
很明显,异常发生在seconds语句中,即MenuItem mi为null.那么为什么第一个语句无法将指针指向正确的MenuItem?
我有一个从main_menu.xml膨胀的菜单:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/act_sync"
android:showAsAction="always"
android:actionLayout="@layout/sync_action"
android:icon="@android:drawable/ic_popup_sync" />
</menu>
Run Code Online (Sandbox Code Playgroud)
这是活动中的代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
MyMessageHandler.debug("menu item selected");
switch(item.getItemId()){
case R.id.act_sync:
sync();
return true;
}
return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)
但是当我触摸菜单项时,不会调用onOptionsItemSelected.当我删除菜单项的actionLayout属性时,它工作正常.我怎样才能解决这个问题?
谢谢.
android menuitem android-layout android-inflate android-actionbar
当我点击操作栏中的操作按钮时,会出现一个PopupMenu.我想在我的PopupMenu中使用像这样的自定义布局的MenuItem:
布局/ menu_item_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/menuItemLayout"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imageViewMenuItem"
android:layout_width="20dip"
android:layout_height="20dip"
android:src="@drawable/abc_list_focused_holo" />
<TextView
android:id="@+id/textViewMenuItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextViewMenuItem" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这是PopUpMenu的xml:
菜单/ pop_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="apparound.actiobarpopupstylefacebook.Main" >
<item
android:id="@+id/popupItem"
android:showAsAction="ifRoom"/>
</menu>
Run Code Online (Sandbox Code Playgroud)
我的活动代码如下:
public void showPopup(int idR){
View menuItemView = findViewById(idR);
PopupMenu popup = new PopupMenu(this, menuItemView);
MenuInflater inflate = popup.getMenuInflater();
inflate.inflate(R.menu.pop_menu, popup.getMenu());
MenuItem menuItem= popup.getMenu().findItem(R.id.popupItem);
menuItem.setActionView(R.layout.menu_item_layout);
popup.show();
}
Run Code Online (Sandbox Code Playgroud)
但是当出现popupmenu时,item为空.我使用setActionview()方法错了吗?谢谢.
当我使用ObservableCollection绑定菜单项时,只能点击MenuItem的"内部"区域:
alt text http://tanguay.info/web/external/mvvmMenuItems.png
在我的视图中我有这个菜单:
<Menu>
<MenuItem
Header="Options" ItemsSource="{Binding ManageMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
</Menu>
Run Code Online (Sandbox Code Playgroud)
然后我用这个DataTemplate绑定它:
<DataTemplate x:Key="MainMenuTemplate">
<MenuItem
Header="{Binding Title}"
Command="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"
Background="Red"
CommandParameter="{Binding IdCode}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
由于ObservableCollection ManageMenuPageItemViewModels中的每个ViewModel 都有一个属性Title和IdCode,因此上面的代码一见即可.
但是,问题是DataTemplate 中的MenuItem实际上在另一个MenuItem中(就像它被绑定两次一样),因此在上面的DataTemplate中,Background ="Red",每个菜单项中都有一个Red框,只有这个区域可以单击,而不是整个菜单项区域本身(例如,如果用户点击复选标记所在的区域或内部可点击区域的右侧或左侧,则没有任何反应,如果您没有单独的颜色很混乱.)
将MenuItems绑定到ViewModel的ObservableCollection的正确方法是什么,以便每个MenuItem中的整个区域都是可点击的?
所以我根据下面的建议进行了以下更改,现在有了这个:
alt text http://tanguay.info/web/external/mvvmMenuItemsYellow.png
我只有我的DataTemplate中TextBlock的,但我还是不能"色全菜单项",但只是将TextBlock:
<DataTemplate x:Key="MainMenuTemplate">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我将Command绑定到Menu.ItemContainerStyle,但它们现在不会触发:
<Menu DockPanel.Dock="Top">
<Menu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Background" Value="Yellow"/>
<Setter …Run Code Online (Sandbox Code Playgroud) 让最简单的代码工作我遇到了很大的麻烦.我希望我的css水平列表居中,就是这样.
链接到这里:http://bit.ly/LtIBai
我有这个代码:
#megaMenu.megaMenuHorizontal ul.megaMenu {
text-align: center;
}
#megaMenu.megaMenuHorizontal ul.megaMenu > li {
display: inline;
}
Run Code Online (Sandbox Code Playgroud)
然而它不会居中?
注意:窗口必须是"平板电脑肖像"大小才能看到我所指的代码.大约800px宽,当徽标居中并且菜单落到下一行时,但在移动菜单出现之前.
我想将ActionBar左侧的一个项目与右侧的其他项目对齐,如下所示:

我的菜单xml中有5个项目.
main.xml中
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="fr.mgs.consulting.allbrary_android.MainActivity" >
<item
android:id="@+id/action_spinner"
android:showAsAction="always"
android:actionLayout="@layout/spinner_actionbar"
android:title="@string/action_spinner"
android:orderInCategory="1"/>
<item
android:id="@+id/action_search"
android:showAsAction="always"
android:title="@string/action_spinner"
android:icon="@drawable/ic_action_search"
android:orderInCategory="2"/>
<item
android:id="@+id/action_tablet"
android:showAsAction="never"
android:title="@string/action_spinner"
android:icon="@drawable/ic_action_tablet"
android:orderInCategory="3"/>
<item
android:id="@+id/action_notifications"
android:showAsAction="always"
android:title="@string/action_spinner"
android:icon="@drawable/ic_action_notifications"
android:orderInCategory="4"/>
<item
android:id="@+id/action_user"
android:showAsAction="always"
android:title="@string/action_spinner"
android:icon="@drawable/ic_action_user"
android:orderInCategory="5"/>
Run Code Online (Sandbox Code Playgroud)
我们该怎么做?抱歉我的英语非常差劲.
每当我尝试使用WPF菜单项的外观时,我都有机会自定义标题,这基本上是项目的文本.
我需要的是一个黑色菜单,白色文字,没有"图标区域".
||一些文字http://img848.imageshack.us/img848/7622/iconarea.png
如何删除菜单项的图标区域?
谢谢.
我想用[menuitem setKeyEquivalent:(NSString*)s]设置menuitem的等效键,如果我有多个修饰符,我该怎么做?
我试过了:
unichar shift = NSShiftKeyMask, cmd = NSCommandKeyMask;
NSMutableString *keyequiv = [[NSMutableString alloc] init];
[keyequiv appendString:[NSString stringWithCharacter:&shift, 1]];
[keyequiv appendString:[NSString stringWithCharacter:&cmd, 1]];
[keyequiv appendString:@"x"];
[menuItem setKeyEquivalent:keyequivalent];
Run Code Online (Sandbox Code Playgroud)
但那不起作用.
如何重置PopupMenu项目列表的最大宽度?
比如你在运行时向popupmenu添加一些TMenuItems:
item1: [xxxxxxxxxxxxxxxxxxx]
item2: [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]
Run Code Online (Sandbox Code Playgroud)
菜单会自动调整大小以适合最大的项目.但是然后你做Items.Clear并添加一个新项目:
item1: [xxxxxxxxxxxx ]
Run Code Online (Sandbox Code Playgroud)
最终结果如此,标题后面有一个很大的空白区域.
除了重新创建popupmenu之外还有其他解决方法吗?
这里是重现这种异常的代码:
procedure TForm1.Button1Click(Sender: TObject);
var
t: TMenuItem;
begin
t := TMenuItem.Create(PopupMenu1);
t.Caption := 'largelargelargelargelargelarge';
PopupMenu1.Items.Add(t);
PopupMenu1.Popup(200, 200);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
t: TMenuItem;
begin
PopupMenu1.Items.Clear;
t := TMenuItem.Create(PopupMenu1);
t.Caption := 'short';
PopupMenu1.Items.Add(t);
PopupMenu1.Popup(200, 200);
end;
Run Code Online (Sandbox Code Playgroud)