SherlockFragment onCreateOptionsMenu没有打电话

时间:2013-11-19 09:30:30

标签: android android-fragments actionbarsherlock oncreateoptionsmenu pagerslidingtabstrip

在我的应用程序中,我有一个扩展 SherlockFragmentActivity 的课程。在该活动中,我在 ActionbarSherlock 的帮助下加载了四个扩展 SherlockFragment 的类,它们假装为 Tabs PagerSlidingTabStrip

扩展 SherlockFragment 的类在 onCreate() <内有 setHasOptionsMenu(true); / strong>方法。即便如此,在运行应用程序时,它也不会调用 onCreateOptionsMenu() 方法。

我在SO中已经阅读了这些类似的问题(Q1Q2)并且没有得到任何帮助。

可能是什么原因?


@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)没有调用。

3 个答案:

答案 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");
}

}