android - (已弃用)片段onOptionsItemSelected未被调用

编辑:这个问题是针对已弃用的sherlock操作栏。 现在应该使用Android支持库

我为我的fragment添加了一个名为share的操作栏菜单选项,但是选择事件没有被捕获

我这样添加它

@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);

}

试图在setHasOptionsMenu(true);和onCreate()中捕获它

@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);

}

}

我在onCreate()有setHasOptionsMenu(true);。

8个解决方案

145 votes

同样的问题发生在我身上:

在Fragment中没有调用onMenuItemSelected事件

搜索谷歌无法找到解决方案,并在FragmentActivity中添加onMenuItemSelected方法无法解决它。

最后通过参考[http://developer.android.com/guide/topics/ui/actionbar.html]解决它

注意:如果您通过Fragment类的onCreateOptionsMenu回调添加了片段中的菜单项,那么当用户选择其中一个片段的项时,系统会为该片段调用相应的onOptionsItemSelected()方法。 但是,活动有机会首先处理事件,因此系统在调用片段的相同回调之前调用活动上的onOptionsItemSelected()。

这意味着只有在活动的onOptionsItemSelected()中没有该菜单项处理程序时,才会调用片段上的onOptionsItemSelected()。

代码如下-----在FragmentActivity上删除R.action.add的处理程序):

@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);

}

}

Fragment上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);

在Fragment中的onCreate方法中

Felixqk answered 2019-09-16T12:23:54Z

126 votes

我遇到了同样的问题,但我认为最好总结一下并介绍最后一步让它运转起来:

在Fragment的false方法中添加onOptionsItemSelected(MenuItem item)方法。

覆盖片段中的onOptionsItemSelected(MenuItem item)(如果您想在片段菜单中执行不同的操作)和false方法。

在Activity的onOptionsItemSelected(MenuItem item)方法中,确保在Fragment的onOptionsItemSelected(MenuItem item)方法中实现菜单项操作时返回false。

一个例子:

活动

@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;

}

Marco HC answered 2019-09-16T12:24:49Z

5 votes

我注意到人们给你的解决方案是在活动中实现你的menue项的代码而不是片段。如果你已经在片段中实现了代码而不是活动'cos在我看来它看起来更好,那么我认为看起来会更有代价。为此,请执行以下操作:

活动

@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;

}

现在行(和喜欢):“return super.onOptionsItemSelected(item);” 在活动和片段中非常重要,因为好像你将遵循调试中的代码,你会看到将首先在Activity上调用menue事件函数,如果该项与activity的switch中的id不匹配 - 例如,degault行:“super.onOptionsItemSelected(item);” 将按照我们的意愿调用片段上的onOptionsItemSelected函数。(如果你有很多片段,请确保在它们中也有这一行,因为调用hirarchy可能有些复杂)。

Malfonde answered 2019-09-16T12:25:26Z

2 votes

我正在使用actionbarsherlock。 这对我有用:

1)创建dummy_menu.xml菜单

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(true)并覆盖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);

}

希望它可以帮助某人。

okkko answered 2019-09-16T12:26:13Z

2 votes

编辑操作栏sherlock使用

我不得不使用

public boolean onMenuItemSelected(int featureId, MenuItem item) {

在主要活动中捕获菜单项

user1634451 answered 2019-09-16T12:26:50Z

2 votes

它很简单,您可以在片段中执行此操作,以确保您的操作将正确侦听:

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setHasOptionsMenu(true);

}

Mohamed Hussien answered 2019-09-16T12:27:14Z

0 votes

我有这个问题。 那是因为我压倒了错误的方法

onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item)是我用过的。

确保使用正确的!

Barrie Galitzky answered 2019-09-16T12:27:54Z

0 votes

您没有在活动方法中链接到超类。 请onCreateOptionsMenu()返回super.onCreateOptionsMenu(菜单),并让onOptionsItemSelected()返回super.onOptionsItemSelected(item)(您正在处理的项目除外,该项应返回true表示您已处理该事件)

Divyesh Murani answered 2019-09-16T12:28:20Z

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐