所以我一直在和Android应用程序一起在顶部有一个带有几个Tabs的导航栏,这部分工作正常,但现在我希望能够从不同的片段动态添加菜单项到Action Bar (因为某些碎片可能有不同的选项)。到目前为止,无论我尝试过什么,我似乎都无法调用onCreateOptionsMenu。这是我到目前为止所拥有的
//First I have a holder class that is used to navigate between the different Fragment Tabs
public class ActionHolder extends SherlockFragmentActivity implements ActionBar.TabListener {....
//And then I have this method for switching Fragments based on what Tab is selected
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
int selectedTab = tab.getPosition();
if (selectedTab == 0) {
SalesMainScreen salesScreen = new SalesMainScreen();
ft.replace(R.id.content, salesScreen);
}
else if (selectedTab == 1) {
ClientMainScreen clientScreen = new ClientMainScreen();
ft.replace(R.id.content, clientScreen);
}.....
现在这里是Tab的片段之一(SalesMainScreen),我希望将一些菜单项添加到Action Bar
@Override
public void onCreate (Bundle savedInstanceState) {
Log.i("message","the oncreate method was called");
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) {
return inflater.inflate(R.layout.salesmainscreen, group, false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.i("message", "the oncreatemenu method called");
inflater.inflate(R.menu.menu_refresh, menu);
super.onCreateOptionsMenu(menu, inflater);
}
我看到正在调用的OnCreate Log消息但是我没有看到onCreateOptionsMenu日志被调用。此外,我知道有时导入导致问题,但是当我导入Sherlock菜单和菜单Inflater时,我在OnCreateOptionMenu方法上获得了关于它们不兼容的各种错误消息。在此设置中是否可以动态地将菜单项添加到操作栏,或者我应该只添加项目,然后不对那些不适用于正在显示的片段的操作执行任何操作?
答案 0 :(得分:5)
我有一个使用SherlockActionBar
和标签的应用,每个标签都包含SherlockFragment
。主要活动在操作栏中有自己的菜单,其中一个片段将搜索项添加到操作栏菜单。
主要活动如下:
class MainActivity extends SherlockFragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
ActionBar bar = getSupportActionBar();
bar.addTab(createThingOneTab());
bar.addTab(createThingTwoTab());
bar.addTab(createThingThreeTab());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
}
}
选项卡中的片段具有以下内容:
class ThingOneFragment extends SherlockFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
MenuItem search = menu.add("Search");
search.setIcon(android.R.drawable.ic_menu_search);
search.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
...
}
}
当我启动主要活动时,默认情况下标签会显示ThingOneFragment
,我会在操作栏中看到搜索图标。当我选择其他选项卡时,搜索图标会消失。您需要确保使用Menu
,MenuInflater
等的Sherlock类。
我不确定它是否会有所不同,但我的TabListener
看起来像这样:
private TabListener createTabListener(final Class<? extends Fragment> clazz) {
return new TabListener() {
private Fragment mFragment;
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// no action
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mFragment == null) {
mFragment = Fragment.instantiate(activity, clazz.getName());
}
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, mFragment)
.commit();
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// no action
}
};
我不确定这是否会导致您的问题,或者它是否正确处理标签的方式,但我将其包含在内以便完整。