Метод фрагмента onCreateOptionsMenu никогда не вызывается

У меня есть приложение с двумя фрагментами активности. Моя основная активность содержит один фрагмент, и этот фрагмент может определить и раздуть меню, которое находится на панели инструментов, без проблем.

Однако во втором действии, которое использует FragmentStatePagerAdapter для горизонтальной прокрутки между элементами, мой фрагмент, похоже, не может определить меню на панели инструментов.

Проверки:

  • Все мое приложение настроено на использование темы (android:theme="@style/AppTheme") на основе Theme.AppCompat.Light.DarkActionBar.
  • Мой фрагмент расширяет android.support.v4.app.Fragment
  • setHasOptionsMenu(true); это вызывается из метода onCreate() фрагмента
  • хостинговая активность расширяет AppCompatActivity и не реализует само меню панели инструментов
  • мой фрагмент переопределяет void onCreateOptionsMenu(Menu, MenuInflater), но этот метод, кажется, никогда не вызывается

Вы можете посмотреть коммит, который должен добавить это меню, на 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);
        }
    }

    // ...
}

Есть ли что-то, что я делаю неправильно здесь?


person David Stosik    schedule 04.11.2016    source источник
comment
Вы должны использовать метод onPrepareOptionMenu() для использования меню во фрагменте.   -  person Divyesh Patel    schedule 04.11.2016
comment
@Divyesh Спасибо. К сожалению, даже после попытки переопределить этот метод (с s: onPrepareOptionsMenu) в моем фрагменте он тоже не вызывается...   -  person David Stosik    schedule 04.11.2016
comment
Ваша вторая активность определяет пункт меню или нет?   -  person Divyesh Patel    schedule 04.11.2016
comment
@Divyesh Нет, действие ничего не делает с меню.   -  person David Stosik    schedule 04.11.2016
comment
Активность должна определять меню OncreateOption. Вы должны определить пункт меню в своей деятельности и просто использовать sethasOptionMenu(true) в своих фрагментах.   -  person Divyesh Patel    schedule 04.11.2016
comment
@Divyesh Почему это необходимо, тогда как моя основная деятельность не определяет onCreateOptionsMenu, а фрагмент может это сделать? В документации Android говорится, что и действия, и фрагменты могут определять элементы меню, здесь: developer.android.com/guide/topics/ui/menus.html#options-menu   -  person David Stosik    schedule 04.11.2016
comment
Я думаю, вы забыли переопределить OncreateView() во фрагменте. Добавьте sethasOptionMenu в этот метод и проверьте журнал.   -  person Divyesh Patel    schedule 04.11.2016
comment
@Divyesh Я тоже пробовал, безуспешно...   -  person David Stosik    schedule 04.11.2016
comment
stackoverflow.com/ вопросы/30721664/   -  person Divyesh Patel    schedule 04.11.2016
comment
@Divyesh Спасибо, но, к сожалению, ни один из ответов не помог мне решить мою проблему.   -  person David Stosik    schedule 05.11.2016
comment
Можете ли вы попытаться инициализировать панель инструментов в хостинге?   -  person Divyesh Patel    schedule 05.11.2016
comment
@Divyesh Большое спасибо за вашу помощь, я очень ценю. К сожалению, снова попытка настроить меню панели инструментов в хостинге, хотя это и сработало, не то, что я хотел. В любом случае, я наконец нашел решение своей проблемы, как вы можете найти в сообщении с ответом, которое я написал ниже: 2341409   -  person David Stosik    schedule 05.11.2016


Ответы (1)


Хорошо, это заняло у меня время, но я, наконец, нашел, что не так с моим кодом. Это было немного сложно.

В предыдущем изменении я отменил FragmentStatePagerAdapter#setPrimaryItem() в деятельности хостинга, чтобы получать информацию каждый раз, когда пользователь переключается между страницами.

К сожалению, в этом переопределении я забыл вызвать super, и это, по-видимому, запутало приложение.

Мне просто нужно было добавить этот вызов в 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));
    }
    // ...
}
person David Stosik    schedule 05.11.2016
comment
Я переопределяю метод setPrimaryItem() на своей пользовательской странице просмотра, но он все равно не работает. У вас есть другие идеи? - person Himadri; 11.06.2019