无法覆盖ListFragment中的onCreateOptionsMenu

时间:2011-10-21 09:35:51

标签: android override compatibility fragment

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

我的活动扩展了ListFragment,我试图覆盖onCreateOptionsMenu(菜单菜单,MenuInflater inflater),如下面的链接:http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuSupport.html

我以前称之为setHasOptionsMenu。

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

这是错误消息:

  

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

我这样做了:

Public class MyFragment extends ListFragment

10 个答案:

答案 0 :(得分:55)

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

答案 1 :(得分:47)

好的,我刚遇到同样的问题,虽然这里没有解决的问题。我正在使用ActionBarSherlock库,结果onCreateOptionsMenu希望Menu来自android.support.v4.view.MenuMenuInflater来自android.view.MenuInflater,而不是android.support.v4.view.MenuInflater }}。不要问我为什么。我不知道这是否会解决所有问题,所以我将分享我是如何理解的:

右键单击您希望方法位于Elcipse的空白区域>来源>覆盖/实施方法......

然后从这里找到它,Eclipse会自动导入正确的东西。

答案 2 :(得分: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;
    }

...


}

答案 3 :(得分:16)

有同样的问题,但那是因为我在片段中使用了错误的onCreateOptionsMenu方法!

布尔onCreateOptionsMenu(Menu menu)仅适用于活动。

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

必须将其移动到包含Fragment的活动类。

片段有自己的: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

答案 4 :(得分:7)

哎哟!!!那是一个很好的!

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

我在这个上面丢了几个小时!希望这篇文章能够至少帮助别人。

答案 5 :(得分:2)

试试这个,实际上IDE已经混淆了bw原生菜单导入和Sherlock import..so如果我们清楚地指定它然后它将被解决..

@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

}

答案 6 :(得分:1)

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

答案 7 :(得分:0)

在Xamarin的活动中遇到同样的问题。 它期待该方法将Xamarin.ActionbarSherlockBinding.Views.IMenu作为参数。

如何找出: -Comment OnCreateOptionsMenu方法您已开始实施。 - 在某些工作方法中,开始键入OnCreateOptionsMenu,就像你想要调用它一样。 - 从建议列表中选择它。 - 将光标放在OnCreateOptionsMenu调用上。 -press Command + d转到汇编浏览器。您将看到实现的界面。 - 然后通过在参数类型上按鼠标指针,您将进入此类型实现的接口。 - 你会看到它所在的命名空间。

答案 8 :(得分:0)

我有同样的问题,这就是我在Fragment的onCreateOptionsMenu上所做的。 重写Fragment的onCreate方法,并确保使用参数值为#34; true"的setHasOptionsMenu方法。让系统知道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);
}

答案 9 :(得分:-1)

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