aro*_*ero 40 android fragment android-fragments
我有一个片段类扩展Fragment并调用setHasOptionsMenu参与菜单.这个类也实现了onCreateOptionsMenu,onPrepareOptionsMenu和onOptionsItemSelected.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
....
}
Run Code Online (Sandbox Code Playgroud)
我正在使用FragmentTransaction我的Activity(扩展FragmentActivity)动态加载这个片段.
但是没有调用任何菜单回调(onCreateOptionsMenu,onPrepareOptionsMenu和onOptionsItemSelected)(我在这些方法中调试了一些断点)并且未显示菜单.
我错过了什么吗?我需要在我的活动中添加一些内容吗?
我正在使用Android兼容性库,使用L11 SDK进行编译并在Xoom中进行测试.
编辑:我发现了问题.我的AndroidManifest目标是L11,这似乎隐藏了菜单按钮并阻止调用回调.但是,如果我从清单中删除它,我会丢失一些我需要的其他功能(例如列表中的激活状态).有没有人知道如何解决这个问题(启用菜单按钮)而不targetSdkVersion=11从清单中删除?
小智 29
Aromero,不要忘记使用方法的片段版本覆盖onCreateOptionsMenu,类似于:
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.queue_options, menu);
super.onCreateOptionsMenu(menu, inflater);
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这会在片段中进行,并添加到Activity的膨胀菜单中(如果有的话).我自己也有同样的问题,直到我弄明白了.
金
如果你在使用ActionBarSherlock时遇到这个问题,你需要确保你的片段是SherlockFragments,而不仅仅是支持片段,你要覆盖的是
public void onPrepareOptionsMenu (com.actionbarsherlock.view.Menu menu) {
Run Code Online (Sandbox Code Playgroud)
不
public void onPrepareOptionsMenu (android.view.Menu menu) {
Run Code Online (Sandbox Code Playgroud)
如果你做了后者,你应该得到关于函数是最终的某种警告,你无法覆盖它.这是一个警告,你试图覆盖错误的功能!
如果通过将类从SherlockFragment切换到仅仅片段来修复错误,则可以创建该函数...但它不会被调用.
我有同样的问题,但我认为最好总结并介绍最后一步让它工作:
在Fragment的onCreate(Bundle savedInstanceState)方法中添加setHasOptionsMenu(true)方法.
onCreateOptionsMenu(Menu menu, MenuInflater inflater)在片段中覆盖(如果你想在Fragment的菜单中做一些不同的事情)和onOptionsItemSelected(MenuItem item)方法.
在onOptionsItemSelected(MenuItem item)Activity的方法中,确保在onOptionsItemSelected(MenuItem item)Fragment的方法中实现菜单项操作时返回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;
}
Run Code Online (Sandbox Code Playgroud)
分段
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
....
}
@Override
public void onCreateOptionsMenu(Menu menu) {
// 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;
}
Run Code Online (Sandbox Code Playgroud)
我希望这会有所帮助.
干杯.
如果您有一个活动和一个片段,每个加载菜单项,那么您需要特别注意您使用的覆盖.
活动可以覆盖onOptionsItemSelected和onMenuItemSelected,但片段只能覆盖onOptionsItemSelected.
如果覆盖活动中的onMenuItemSelected和片段中的onOptionsItemSelected,则永远不会触发片段覆盖.
相反,在activity和fragment中使用onOptionsItemSelected.
您需要确保在片段中调用setHasOptionsMenu(true); onCreate或onCreateView调用.
您还需要onCreateOptionsMenu在片段内实现覆盖.
我已经找到问题了。AndroidManifest 针对的是 SDK 11,这似乎隐藏了菜单按钮并阻止调用回调。我认为这破坏了菜单按钮的兼容性,菜单按钮似乎被 Android 3.0 中的操作栏取代
| 归档时间: |
|
| 查看次数: |
25974 次 |
| 最近记录: |