Fragment 的 onCreateOptionsMenu 方法从未被调用

Fragment's onCreateOptionsMenu method is never called

我有一个包含两个活动托管片段的应用程序。我的主要 activity 托管一个片段,该片段能够定义和扩充工具栏中的菜单,没问题。

虽然在第二个 activity 中使用 FragmentStatePagerAdapter 允许在项目之间水平滚动,但我的片段似乎无法定义工具栏中的菜单。

支票:

You can have a look at the commit that is supposed to add that menu on GitHub.(甚至查看可能导致错误的代码的任何部分。)

以下是大行:

CrimeFragment.java:

public class CrimeFragment extends Fragment {

    // ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate()");
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        UUID id = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
        Log.d(TAG, String.format("Crime id in intent's extra: %s", id.toString()));
        mCrime = CrimeLab.get(getActivity()).getCrime(id);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        Log.d(TAG, "onCreateOptionsMenu()"); // <= Never shows in the Android Monitor
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.fragment_crime, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_item_delete_crime:
                CrimeLab.get(getActivity()).deleteCrime(mCrime);
                getActivity().finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    // ...
}

我这里有什么地方做错了吗?

好吧,花了我一些时间,但我终于找到了我的代码有什么问题。这有点棘手。

在主机 activity 中的一个 earlier change, I overrode FragmentStatePagerAdapter#setPrimaryItem() 中,以便每次用户在页面之间切换时得到通知。

不幸的是,在那个重写中,我忘记调用 super,显然这就是混淆应用程序的原因。

我不得不 add that call to super,我的菜单项突然开始出现。

public class CrimePagerActivity extends AppCompatActivity {

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

        FragmentManager fragmentManager = getSupportFragmentManager();
        mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {
            // ...

            @Override
            public void setPrimaryItem(ViewGroup container, int position, Object object) {
                super.setPrimaryItem(container, position, object); // <= This line was missing
                Crime crime = mCrimes.get(position);
                mChangedCrimeIds.add(crime.getId());
            }
        });
        mViewPager.setCurrentItem(CrimeLab.get(this).getPosition(crimeId));
    }
    // ...
}