无法在ListFragment中覆盖onCreateOptionsMenu方法

28

我创建了一个支持手机和平板电脑版本的应用程序,因此使用android-support-v4.jar库。

我的活动扩展了ListFragment,并尝试重写onCreateOptionsMenu(Menu menu, MenuInflater inflater),如下面的链接所示: http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuSupport.html

我之前调用了setHasOptionsMenu。

不幸的是,似乎我无法覆盖onCreateOptionsMenu()。

这是错误消息:

类型MyFragment的onCreateOptionsMenu(Menu menu, MenuInflater inflater)必须覆盖或实现超类型方法。

而我使用以下代码来实现:

Public class MyFragment extends ListFragment
10个回答

55

确保导入的内容来自兼容性库而不是SDK本身。


当你回复时,我正在编写我的解决方案 ;-) 你是对的,那就是问题所在。谢谢。 - Waza_Be
9
如果您通过谷歌搜索ActionBarSherlock的相同错误而来到这个问题,同样的解决方案适用。删除菜单导入语句并从ABS重新导入菜单。然后将getMenuInflater替换为getSupportMenuInflater。 - Snicolas
1
只是为了更清楚:您需要覆盖使用sherlock Menu类的方法,而不是sdk的那些。同时使用getSupportMenuInflater()来填充lib Menu。 - Rafael Sanches

47

好的,我也遇到了同样的问题,不过并没有通过这里提供的方法解决。我正在使用ActionBarSherlock库,结果发现onCreateOptionsMenu需要从android.support.v4.view.Menu中获取Menu,而MenuInflater需要从android.view.MenuInflater中获取,而不是从android.support.v4.view.MenuInflater中获取。别问我为什么,我也不知道是否能解决所有人的问题,所以我会分享一下我的解决方法:

在Eclipse中,右键单击你想要放置该方法的空白空间 > Source > Override/Implement methods...

然后在这里找到它,Eclipse将自动导入正确的内容。


17
注意:如果您想使用 inflater,您需要将 getMenuInflater() 替换为 getSupportMenuInflater() - Grimmace
在我的情况下,我忘记了继承SherlockFragment而不是Fragment。 - Felipe
你还需要确保你的主活动扩展了ABS,就像这样:"public class MainActivity extends SherlockActivity {" - Britc

26

我在我的活动中使用SherlockActionBar时遇到了类似的问题。这是我解决问题的设置:

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;

public class LoginActivity extends SherlockActivity{

    ...

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getSupportMenuInflater().inflate(R.menu.activity_login, menu);
        return true;
    }

    ...

}

1
谢谢。使用getSupportMenuInflater()而不是标准的getMenuInflater()是一个决定。 - Maksim Dmitriev

17

我曾经遇到过同样的问题,但是这是因为我在Fragment中使用了错误的onCreateOptionsMenu方法!

boolean onCreateOptionsMenu(Menu menu)方法只适用于Activities。

@Override //For Activities
public boolean onCreateOptionsMenu(Menu menu) { 
...

不得不将它移到包含片段的活动类中。

片段有自己的void onCreateOptionsMenu(Menu menu, MenuInflater inflater)

@Override //For Fragments.
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater){
...

创建选项菜单:http://developer.android.com/guide/topics/ui/menus.html


7

糟糕!这真是一个好的教训!

在MyFragment中,我导入了android.view.Menu,而不是android.support.v4.Menu!

我浪费了几个小时才意识到问题所在。希望这篇文章至少可以帮助其他人。


2

尝试这个,实际上IDE混淆了本机菜单导入和Sherlock导入...所以如果我们清楚地指定它,问题就会解决...

@Override
    public void onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu,
            com.actionbarsherlock.view.MenuInflater inflater) {

}

@Override
    public boolean onOptionsItemSelected(
            com.actionbarsherlock.view.MenuItem item) {
        // TODO Auto-generated method stub

}

1
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    // TODO Auto-generated method stub
    getSupportMenuInflater().inflate(R.menu.main, menu);
    return true;
}

0

刚在Xamarin的一个活动中遇到了同样的问题。 它期望该方法以Xamarin.ActionbarSherlockBinding.Views.IMenu作为参数。

如何找出: -注释掉您开始实现的OnCreateOptionsMenu方法。 -在某个工作方法中开始输入OnCreateOptionsMenu,就像您想要调用它一样。 -从建议列表中选择它。 -将光标放在OnCreateOptionsMenu调用上。 -按Command+d键进入程序集浏览器。您将看到来自实现的接口。 -然后通过按鼠标指针所需类型的参数,您将进入此类型实现的接口。 -您将看到它所在的命名空间。


0
我曾经遇到过同样的问题,这是我使用Fragment的onCreateOptionsMenu方法的解决方案。 重写Fragment的onCreate方法,并确保使用setHasOptionsMenu方法并将参数值设置为“true”,以便让系统知道Fragment将使用OptionsMenu。
@Override
public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setHasOptionsMenu(true);
}

然后重写onCreateOptionsMenu方法,将你的菜单xml文件进行填充(在这个例子中,我填充了fragmentmenu.xml)

@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
     inflater.inflate(R.menu.fragmentmenu, menu);
}

-1

我使用了com.actionbarsherlock.view.Menu - 也许它已经改变了?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接