【问题标题】:onCreateOptionsMenu() is not getting called on FragmentActivityonCreateOptionsMenu() 没有在 FragmentActivity 上被调用
【发布时间】:2016-01-27 22:49:30
【问题描述】:

同事们,MainActivity 类派生自 FragmentActivity,由于某种原因,活动的 onCreateOptionsMenu() 没有被调用。我在onCreate() 中的第一个断点正在被触发,在onCreateOptionsMenu() 中的第二个断点没有被触发。

import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {

    private FragmentPagerAdapter m_fragmentPagerAdapter;
    private ViewPager m_viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Create the adapter that will return a fragment for each of the  primary sections of the activity.
        m_fragmentPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        m_viewPager = (ViewPager) findViewById(R.id.container);
        m_viewPager.setAdapter(m_fragmentPagerAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);      // Inflate the menu; this adds items to the action bar if it is present.
        return true;
    }
}

此应用中的片段没有自己的菜单。属于活动的一个菜单“涵盖”了所有内容。

主题是 Holo.Light

是什么阻止了onCreateOptionsMenu() 被调用?我错过了什么?

【问题讨论】:

  • 您是否尝试过扩展AppCompatActivity?这将添加一个显示菜单的工具栏。请注意,在这种情况下,您可能需要更改主题。
  • @George 我知道我只针对较新版本的 Android(从 4.3 开始)。据我了解,AppCompat 使旧版本的 API 能够执行新版本中引入的操作。然而,我觉得 AppCompat 是一个我应该可以不用的补丁。 (当然,我对 AppCompat 的历史和用途的理解可能是错误的。)不过,将基类更改为 AppCompatActivity 确实带来了菜单。

标签: android menu


【解决方案1】:

再次检查您是否确实将应用主题设置为Holo.Light。我无法解释导致问题的原因,但我能够重现它。在尝试了FragmentActivityAppCompatActivity 之间的更改后,我不小心将FragmentActivity 和主题设置为Theme.AppCompat.Light 一起运行。这创建了您所看到的行为,没有调用 onCreateOptionsMenu()

作为一个附带问题,您应该修复您的 onCreateOptionsMenu() 以调用 super,如 documentation 中所述:“派生类应始终调用基本实现”。

【讨论】:

  • 谢谢。您认为我实际上并未将应用主题设置为 Holo.Light 的预感是正确的。
  • 在犯错的过程中,我遇到了两个演示片段的示例。 This one from Aug 2012 派生自 Activity 并且不使用旧版支持库。 This one from Oct 2013 使用 FragmentActivity。既然Activity 似乎可以处理片段,那么是否总是需要使用FragmentActivity? (我的这个应用会从零开始写,不用支持老设备。)
  • @NickAlexeev:如果您不需要支持 API 11 之前的设备,您可以使用 Activity 而不是 FragmentActivity。API 小于 11 的设备现在约为 3%,根据这个dashboard
【解决方案2】:

试试:

setHasOptionsMenu();//call it from onCreate(); or onViewCreated();

这个方法只在fragment中使用,告诉activity这个fragment有一个选项菜单。

【讨论】:

    【解决方案3】:

    添加 setHasOptionsMenu(true);在你的 onCreate() 方法中。

    【讨论】:

    • OP 正试图让它显示在 Activity 而不是 Fragment
    • FragmentActivity 没有setHasOptionsMenu() 方法。
    • 你是否尝试调用 return super.onCreateOptionsMenu(menu);在你的 onCreateOptionsMenu();?
    猜你喜欢
    • 2020-09-10
    • 2011-10-19
    • 2013-10-21
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多