编辑:这个问题问得已过时的福尔摩斯行动吧。 Android的支持库应该改为现在使用
我已经添加了名为份额为我的一个操作栏菜单选项fragment
出现,但没有被抓住的评选活动
我加入它像这样
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
MenuItem item = menu.add(0, 7,0, R.string.share);
item.setIcon(R.drawable.social_share).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
试图捕捉它在这两个fragment
与fragment activity
像
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 7:
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, "I'm being sent!!");
startActivity(Intent.createChooser(share, "Share Text"));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
我有setHasOptionsMenu(true);
在onCreate()
Answer 1:
同样的问题发生在我身上:
onMenuItemSelected事件并没有得到所谓的碎片
谷歌搜索水湿找到一个解决方案,并在FragmentActivity添加onMenuItemSelected方法并不能解决问题。
最后,按照参考解决它http://developer.android.com/guide/topics/ui/actionbar.html
注意:如果你从一个片段添加菜单项,通过碎片类的onCreateOptionsMenu回调,那么,系统将调用此片段相应的onOptionsItemSelected()方法,当用户选择的片段的项目之一。 然而,活动都将有机会首先处理该事件,所以在系统调用上的活动onOptionsItemSelected()呼吁片段相同的回调之前。
这意味着只有当你没有在onOptionsItemSelected()是菜单项的处理程序上的活动时,onOptionsItemSelected()的片段将会被调用。
代码如下-----删除了R.action.add上FragmentActivity处理程序):
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
popBackStack();
return true;
case R.id.action_search:
searchAction();
return true;
case R.id.action_logout:
userLogout();
return true;
//case R.id.action_add:
//return true;
default:
return super.onOptionsItemSelected(item);
}
}
而对于R.action.add片段上的处理程序是这样的:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d("onOptionsItemSelected","yes");
switch (item.getItemId()) {
case R.id.action_add:
add();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
最后,记得要加
setHasOptionsMenu(true);
在片段的onCreate方法
Answer 2:
我有同样的问题,但我认为这是更好地总结和介绍的最后一步得到它的工作:
加入setHasOptionsMenu(true)
在片段的方法onCreate(Bundle savedInstanceState)
方法。
重写onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(如果你想要做的事在你的碎片的不同菜单)和onOptionsItemSelected(MenuItem item)
方法,在你的片段。
里面的活动的onOptionsItemSelected(MenuItem item)
方法,请确保您返回false
时菜单项行动将在片段的实施onOptionsItemSelected(MenuItem item)
方法。
一个例子:
活动
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.activity_menu_item:
// Do Activity menu item stuff here
return true;
case R.id.fragment_menu_item:
// Not implemented here
return false;
default:
break;
}
return false;
}
分段
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
....
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Do something that differs the Activity's menu here
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.activity_menu_item:
// Not implemented here
return false;
case R.id.fragment_menu_item:
// Do Fragment menu item stuff here
return true;
default:
break;
}
return false;
}
Answer 3:
我注意到,该解决方案的人给你是为了实现在活动的menue项目的代码,而随后的片段。 我认为它会看起来更orgenized如果你已经执行片段中的代码,而不是在我看来活动“因为这一切看起来更好。 要做到这一点,请执行以下操作:
活动
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.SomeIDInTheMenueOfTheActivity:
{
//something();
break;
}
default:
//do something default and add the code under :
return super.onOptionsItemSelected(item);
}
return true;
}
分段
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.SomeIDInFragmentMenue:
{
break;
}
default:
return super.onOptionsItemSelected(item);
}
return true;
}
现在线(和喜欢):“回归super.onOptionsItemSelected(项目);” 在活动和片段是超级重要的,因为如果你将遵循在调试的代码,你将看到menue事件功能将首先呼吁活动,如果该项目不匹配的ID在该活动的开关 - 情况下,degault行: “super.onOptionsItemSelected(项目);” 将呼吁片段onOptionsItemSelected功能,因为我们想。 (如果你有很多碎片,一定要在他们那行,以及作为主叫hirarchy可能有点复杂)。
Answer 4:
我使用actionbarsherlock。 这为我工作:
1)创建dummy_menu.xml菜单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" >
<item
android:title=""
android:showAsAction="never"
android:id="@+id/dummyMenu"
/>
2)在活性膨胀这样的菜单。
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.dummy_menu,menu);
return super.onCreateOptionsMenu(menu);
}
3)在片段onCreateView调用setHasOptionsMenu(真),并覆盖onCreateOptionsMenu和onOptionsItemSelected也隐藏dummyMenu像这样(在片段)
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_actions, menu);
MenuItem item = menu.findItem(R.id.dummyMenu);
item.setVisible(false);
super.onCreateOptionsMenu(menu, inflater);
}
希望它可以帮助别人。
Answer 5:
编辑的动作条福尔摩斯使用
我不得不使用
public boolean onMenuItemSelected(int featureId, MenuItem item) {
在主要活动捕捉菜单项
Answer 6:
它是如此简单,你可以做你的片段,以确保您的行为将正确听:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
Answer 7:
我有这个问题。 这是因为我overiding错误的方法
onOptionsItemSelected(com.actionbarsherlock.view.MenuItem项目)是我用什么。
请确保您使用的是正确的!
Answer 8:
您还没有链接到的活性的方法超类。 请有onCreateOptionsMenu()返回super.onCreateOptionsMenu(菜单),并已onOptionsItemSelected()返回super.onOptionsItemSelected(项目)(除了你正在处理的项目,它应返回true,表明你已经处理该事件)
文章来源: (Deprecated) Fragment onOptionsItemSelected not being called