【问题标题】:SherlockFragment onCreateOptionsMenu is not callingSherlockFragment onCreateOptionsMenu 没有调用
【发布时间】:2013-11-19 09:30:30
【问题描述】:

在我的应用程序中,我有一个扩展 SherlockFragmentActivity 的类。在那个 Activity 中,我加载了四个类,它们扩展了 SherlockFragment,在 ActionbarSherlock 的帮助下伪装成 TabsPagerSlidingTabStrip

扩展SherlockFragment的类有setHasOptionsMenu(true);onCreate() 方法。即使这样,在运行应用程序时,它也不会调用 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(Menu menu, MenuInflater inflater)

【问题讨论】:

  • 也许你在膨胀菜单之前忘了加menu.clear()
  • @Naddy 不...我告诉onCreateOptionsMenu() 甚至不打电话。如果我将 Log 消息作为第一行放在该方法中,则不会打印。
  • @Naddy 已添加到问题中
  • 我已经实现了相同的代码,它对我有用。唯一的区别是我以编程方式创建了 MenuItems。你在使用 MapFragment??
  • @Naddy 我没有使用 MapFragment。我也可以通过编程方式创建MenuItems。但是要以编程方式创建MenuItems,我们需要在Fragment 中触发onCreateOptionsMenu()。那是我没有发生的地方。您可能在SherlockFragmentActivity 中实现了MenuItems 而不是SherlockFragment 或者您可能没有为不同的片段创建不同的MenuItems。顺便说一句,感谢您分享您的经验。

标签: android android-fragments actionbarsherlock oncreateoptionsmenu pagerslidingtabstrip


【解决方案1】:

进口应该是:

import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

而不是安卓操作系统的这些!

还可以尝试调用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");
}

【讨论】:

  • @AnujAroshA 您确定该活动不会禁用菜单吗?也向活动添加方法以测试它是否起作用......
  • 实际上,如果我在扩展 SherlockFragmentActivity 的 Activity 类中的 onCreateOptionsMenu() 中创建菜单项,它将显示在菜单中。但是后来我无法根据片段更改更改菜单项。这就是我尝试在每个 Fragment Activity 中实现菜单项的原因。
【解决方案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);
}

仅此而已。

这不是很干净的解决方案,应该在库中修复。 :)

谢谢, 乌拉姆

【讨论】:

    【解决方案3】:

    这是我编写的确切代码,并且运行良好。

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

    【讨论】:

    • 我已经更新了这个问题。请添加您的经验。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多