从SherlockActionBar片段选项卡动态添加菜单项

3

我一直在开发一个Android应用程序,它有一个在顶部带有多个选项卡的导航栏,这部分功能正常,但现在我想从不同的片段动态地向操作栏添加菜单项(因为某些片段可能有不同的选项可用)。到目前为止,无论我尝试什么,我似乎都无法调用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);
    }.....

现在这是一个选项卡片段(SalesMainScreen),我希望在动作栏中添加一些菜单项。

 @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日志消息被调用,但我根本没有看到调用onCreateOptionsMenu的日志。此外,我知道有时导入会引起问题,但是当我导入Sherlock菜单和菜单膨胀器时,在OnCreateOptionMenu方法上会出现各种错误消息,说它们不兼容。在这种设置中是否可以动态添加菜单项到操作栏,或者我应该只添加项目,然后对不适用于正在显示的片段的项目不执行任何操作?


可能与super.onCreate(savedInstanceState)有关,紧接着是setHasOptionsMenu(true)吗?那会覆盖所有内容吗? - RdPC
1个回答

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);
        ...
    }

}

当我启动主 activity 时,默认显示标签页 ThingOneFragment,并在操作栏中看到搜索图标。当我选择其他标签页时,搜索图标消失。请确保您正在使用 Sherlock 的类来处理 MenuMenuInflater 等。我不确定这是否有所不同,但我的 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
        }
    };

我不确定这是否导致了您的问题,或者它是否是处理选项卡的正确方式,但我包括它以完整性。


@John 我也遇到了同样的问题...你能否提供更多的代码示例呢?比如createThingOneTab()函数的实现以及其他函数的实现?谢谢! - newton_guima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接