OnOptionsItemSelected в activity вызывается перед onOptionsItemSelected во фрагменте. Другой способ возможен?

у меня есть действие, которое может содержать несколько фрагментов. Каждый из фрагментов может иметь свои собственные записи меню в ActionBar. Это прекрасно работает до сих пор, и каждый элемент является интерактивным и выполняет желаемое действие.

моя проблема заключается в следующем. В MainActivity я объявил следующие строки для перехвата вызовов в HomeIcon ActionBar:

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            clearBackStack();
                    setHomeFragment();
            return true;
        default:
            return super.onOptionsItemSelected(item);

        }
    }

Я объявил об этом в Activity, потому что я хотел, чтобы каждый фрагмент вызывал это так, чтобы я не нужно ловить андроида.R.id.домашний кейс в каждом фрагменте.

в одном фрагменте я использую setDisplayHomeAsUpEnabled (true), так что я получаю маленькую стрелку слева от значка ActionBar. Когда HomeIcon щелкнут в этом фрагменте, я не хочу устанавливать HomeFragment, я хочу установить фрагмент, который был последним отображен. Поэтому у меня есть метод onOptionsItemSelected - во фрагменте:

@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {

    switch (menuItem.getItemId()) {
    case android.R.id.home:
        setLastFragment();
               return true;
    ...

однако это не работает так, как я хотел, чтобы это работало. деятельность onOptionsItemSelected вызывается первым, ловит MenuItem и перенаправляет на HomeFragment. С другими MenuItems, объявленными в других фрагментах, я могу проверить то же самое поведение. Сначала вызывается Activity, не улавливает MenuItem (случай по умолчанию), а затем перенаправляется на super.onOptionsItemSelected (item).

таким образом, кажется, что это так, как Android обрабатывает щелчки меню. Сначала действие, затем фрагмент. Есть ли способ изменить это? Я не хочу ставить андроид.R.id.home-case в каждом фрагменте и обрабатывать его там. Есть ли лучший способ сделать это?

4 ответов


согласно ссылке разработчиков,

"верните false, чтобы продолжить обычную обработку меню, true, чтобы использовать его здесь."

поэтому я бы попытался вернуть "false" по умолчанию в реализации действия onOptionsItemSelected(), таким образом, событие перейдет к реализации фрагмента, если оно не будет поймано.


Я просто сталкиваюсь с этой проблемой, и я заставил ее работать, используя следующий код. В деятельности


Не уверен, что это возможно. В официальных документах, доступных здесь:

http://developer.android.com/guide/topics/ui/actionbar.html#ActionEvents

есть примечание, в котором указано следующее:

[...] Однако действие получает возможность сначала обработать событие, поэтому система сначала вызывает onOptionsItemSelected () для действия перед вызовом того же обратного вызова для фрагмента.


вы можете сделать как @, конечно, написано, это отличная идея, но в этом случае вы будете называть onOptionsItemSelected на фрагменте, не зная, какой фрагмент это, и вы должны переопределить onOptionsItemSelected метод во всех ваших фрагментов.

если вы хотите вызвать этот метод только для определенных фрагментов, вы должны найти их по тегу, который вы использовали при их добавлении:

case android.R.id.home:
            Fragment frag = getSupportFragmentManager()
                    .findFragmentByTag(FRAGMENT_TAG);

            if(frag != null && frag.isVisible() && frag.onOptionsItemSelected(item)) {
                return true;

тег указывает следующим образом:

fragmentManager.beginTransaction()
            .add(containerId, fragment, FRAGMENT_TAG)