在我的应用程序中,我有一个扩展 SherlockFragmentActivity 的课程。在该活动中,我在 ActionbarSherlock 的帮助下加载了四个扩展 SherlockFragment 的类,它们假装为 Tabs 和 PagerSlidingTabStrip 。
扩展 SherlockFragment 的类在 onCreate() <内有 setHasOptionsMenu(true); / strong>方法。即便如此,在运行应用程序时,它也不会调用 onCreateOptionsMenu() 方法。
我在SO中已经阅读了这些类似的问题(Q1,Q2)并且没有得到任何帮助。
可能是什么原因?
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.record, menu);
super.onCreateOptionsMenu(menu, inflater);
Log.i(TAG, "* onCreateOptionsMenu");
}
更新
我认为原因是,我在另一个SherlockFragment中使用了SherlockFragment。 PageSlidingTabStripFragment.java中的方法在 MyPagerAdapter 类中有以下方法。
@Override
public SherlockFragment getItem(int position) {
return SuperAwesomeCardFragment.newInstance(position);
}
我正在做的是,我正在从那里调用其他一些SherlockFragments,如下所示。
@Override
public SherlockFragment getItem(int position) {
Log.i(TAG, "* getItem");
switch (position) {
case 0:
return new InnerSherlockFragmentOne();
case 1:
return new InnerSherlockFragmentTwo();
case 2:
return new InnerSherlockFragmentThree();
case 3:
return new InnerSherlockFragmentFour();
default:
return null;
}
}
在这些InnerSherLockFragments中, onCreateOptionsMenu(菜单菜单,MenuInflater inflater)没有调用。
答案 0 :(得分:4)
导入应为:
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
而不是Android OS的这些!
还可以尝试调用super
方法,如:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.record, menu);
Log.i(TAG, "* onCreateOptionsMenu");
}
答案 1 :(得分:2)
我最近遇到了同样的问题。我的代码与你的代码非常相似,我在PagerSlidingTabStrip中使用Fragment ......
我的解决方案是这样的。
我的片段中没有做任何事情,但修复了PageSlidingTabStripFragment.java中的源代码
PageSlidingTabStripFragment.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new MainPagerAdapter(getChildFragmentManager());
setHasOptionsMenu(true);
setRetainInstance(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.e("test", "Fragment onCreateOptionsMenu");
int position = pager.getCurrentItem();
if (position == 4) {
inflater.inflate(R.menu.fragment_report_menu, menu);
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.board_list_menu_new:
ReportFragment fragment = (ReportFragment) adapter.getItem(pager.getCurrentItem());
fragment.onMyOptionItemSelected();
break;
}
return super.onOptionsItemSelected(item);
}
就这一切。
这不是一个非常干净的解决方案,应该在库中修复。 :)
谢谢, Wooram
答案 2 :(得分:1)
这是我写的确切代码,它运行正常。
import android.os.Bundle;
import android.util.Log;
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
public class First extends SherlockFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
Log.i("TAG", "* created");
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
menu.add("abcd").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add("efgh").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
Log.i("TAG", "* onCreateOptionsMenu");
}
}