Окно.Обратный вызов перезаписывается панелью инструментов

#java #android #android-actionbar #toolbar #android-toolbar

#java #Android #android-actionbar #панель инструментов #android-панель инструментов

Вопрос:

Я обнаружил, что в setActionBar методе из Activity :

 public void setActionBar(@Nullable Toolbar toolbar) {
    final ActionBar ab = getActionBar();
    if (ab instanceof WindowDecorActionBar) {
        throw new IllegalStateException("This Activity already has an action bar supplied "  
                "by the window decor. Do not request Window.FEATURE_ACTION_BAR and set "  
                "android:windowActionBar to false in your theme to use a Toolbar instead.");
    }

    // If we reach here then we're setting a new action bar
    // First clear out the MenuInflater to make sure that it is valid for the new Action Bar
    mMenuInflater = null;

    // If we have an action bar currently, destroy it
    if (ab != null) {
        ab.onDestroy();
    }

    if (toolbar != null) {
        final ToolbarActionBar tbab = new ToolbarActionBar(toolbar, getTitle(), this);
        mActionBar = tbab;
        mWindow.setCallback(tbab.getWrappedWindowCallback());
    } else {
        mActionBar = null;
        // Re-set the original window callback since we may have already set a Toolbar wrapper
        mWindow.setCallback(this);
    }

    invalidateOptionsMenu();
}
  

Как вы можете видеть там mWindow.setCallback(tbab.getWrappedWindowCallback()) , вызывается с обернутым обратным вызовом. И если мы проверим реализацию ToolbarAractionBar :

 ToolbarActionBar(Toolbar toolbar, CharSequence title, Window.Callback windowCallback) {
    mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false);
    mWindowCallback = new ToolbarCallbackWrapper(windowCallback);
    mDecorToolbar.setWindowCallback(mWindowCallback);
    toolbar.setOnMenuItemClickListener(mMenuClicker);
    mDecorToolbar.setWindowTitle(title);
}

public Window.Callback getWrappedWindowCallback() {
    return mWindowCallback;
}
  

Он переносит последний параметр конструктора, который был this (экземпляр Activity ).

Проблема возникает, если перед вызовом setActionBar мы устанавливаем нашу собственную реализацию Window.Callback (которая корректно переносит исходную). В этом случае обернута не наша реализация ToolbarActionBar , а оригинальная.

Это не было бы проблемой, если бы getWindow().getCallback() использовалось вместо this в качестве ToolbarActionBar параметра конструктора. Так что это похоже на ошибку в Android sdk.

Вопрос в том, знает ли кто-нибудь, как справиться с такой ситуацией или каким-либо обходным путем для этой проблемы? (давайте предположим, что мы должны установить наш обратный вызов перед добавлением панели действий)


кстати. setSupportActionBar выглядит не так же, но очень похоже и имеет ту же проблему.