#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
выглядит не так же, но очень похоже и имеет ту же проблему.