无法覆盖 ListFragment 中的 onCreateOptionsMenu
Posted
技术标签:
【中文标题】无法覆盖 ListFragment 中的 onCreateOptionsMenu【英文标题】:Unable to override onCreateOptionsMenu in ListFragment 【发布时间】:2011-12-12 10:47:42 【问题描述】:我创建了一个同时支持手机和平板电脑版本的应用,所以我使用了 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()。
这是错误信息:
方法onCreateOptionsMenu(Menu menu, MenuInflater inflater) MyFragment 类型必须覆盖或实现超类型方法。
我做到了:
Public class MyFragment extends ListFragment
【问题讨论】:
【参考方案1】:确保导入来自兼容性库,而不是来自 SDK 本身。
【讨论】:
当您回复时,我正在编写我的解决方案;-) 您是对的,这就是问题所在。谢谢。 如果您通过谷歌搜索 ActionBarSherlock 的相同错误来解决此问题,则适用相同的解决方案。删除菜单导入语句并从 ABS 重新导入菜单。将 getMenuInflater 替换为 getSupportMenuInflater。 更清楚一点:您需要重写使用sherlock Menu 类的方法,而不是sdk 类。还可以使用 getSupportMenuInflater() 为 lib 菜单充气。【参考方案2】:好的,我也遇到了同样的问题,虽然这里的内容并没有解决这个问题。我正在使用 ActionBarSherlock 库,结果发现 onCreateOptionsMenu
希望 Menu
来自 android.support.v4.view.Menu
和 MenuInflater
来自 android.view.MenuInflater
,而不是 android.support.v4.view.MenuInflater
。不要问我为什么。我不知道这是否会解决每个人,所以我将分享我是如何解决的:
在 Elcipse 中您希望方法所在的空白处右键单击 > Source > Overide/Implement methods...
然后从这里找到它,Eclipse会自动导入正确的东西。
【讨论】:
注意:如果您确实想使用充气机,您需要将getMenuInflater()
换成getSupportMenuInflater()
。
在我的例子中,我忘记扩展 SherlockFragment 而不是 Fragment。
您还需要确保您的主要活动像这样扩展 ABS:“public class MainActivity extends SherlockActivity ”【参考方案3】:
我在我的活动中使用 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;
...
【讨论】:
谢谢。getSupportMenuInflater()
而不是标准的getMenuInflater()
是一个决定。【参考方案4】:
遇到了同样的问题,但那是因为我在 Fragment 中使用了错误的 onCreateOptionsMenu 方法!
布尔值onCreateOptionsMenu(Menu menu) 仅用于活动。
@Override //For Activities
public boolean onCreateOptionsMenu(Menu menu)
...
必须将其移至包含 Fragment 的活动类。
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
【讨论】:
【参考方案5】:哎哟!!!那是一个很好的!
我在 MyFragment 中导入了 android.view.Menu 而不是 android.support.v4.Menu!
我在这个上浪费了几个小时!希望这篇文章至少可以帮助其他人。
【讨论】:
【参考方案6】:试试这个,其实IDE混淆了bw native menu import和Sherlock import..所以如果我们明确指定它就会解决..
@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
【讨论】:
【参考方案7】:@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu)
// TODO Auto-generated method stub
getSupportMenuInflater().inflate(R.menu.main, menu);
return true;
【讨论】:
【参考方案8】:刚刚在 Xamarin 上的活动中遇到了同样的问题。 它期望该方法将 Xamarin.ActionbarSherlockBinding.Views.IMenu 作为参数。
如何找到: - 注释您开始实现的 OnCreateOptionsMenu 方法。 - 在某些工作方法中开始输入 OnCreateOptionsMenu 就像你想调用它一样。 - 从建议列表中选择它。 - 将光标放在 OnCreateOptionsMenu 调用上。 -按 Command+d 进入程序集浏览器。您将从实现中看到接口。 - 然后通过在它所采用的参数类型上按下鼠标指针,您将进入该类型实现的界面。 - 你会看到它所在的命名空间。
【讨论】:
【参考方案9】:我遇到了同样的问题,这就是我使用 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);
【讨论】:
【参考方案10】:我用过我用过的 com.actionbarsherlock.view.Menu - 也许从那以后它已经改变了?
【讨论】:
以上是关于无法覆盖 ListFragment 中的 onCreateOptionsMenu的主要内容,如果未能解决你的问题,请参考以下文章
ListFragment OnListItemClick 未被调用
Android:无法让 Checkbox OnClickListener 在 ListFragment 中工作
在 ListFragment 中无法识别 findViewById [重复]