На самом деле, я решил эту проблему, но просто не понимаю, почему Google это делает.
В методе onLayout CollapsingToolbarLayout он сначала рассчитывает положение свернутого заголовка панели инструментов
final int maxOffset = getMaxOffsetForPinChild(
mToolbarDirectChild != null ? mToolbarDirectChild : mToolbar);
ViewGroupUtils.getDescendantRect(this, mDummyView, mTmpRect);
mCollapsingTextHelper.setCollapsedBounds(
mTmpRect.left + (isRtl
? mToolbar.getTitleMarginEnd()
: mToolbar.getTitleMarginStart()),
mTmpRect.top + maxOffset + mToolbar.getTitleMarginTop(),
mTmpRect.right + (isRtl
? mToolbar.getTitleMarginStart()
: mToolbar.getTitleMarginEnd()),
mTmpRect.bottom + maxOffset - mToolbar.getTitleMarginBottom());
и maxOffset рассчитывается на getMaxOffsetForPinChild
, а именно:
final int getMaxOffsetForPinChild(View child) {
final ViewOffsetHelper offsetHelper = getViewOffsetHelper(child);
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
return getHeight()
- offsetHelper.getLayoutTop()
- child.getHeight()
- lp.bottomMargin;
}
проблема в том, что offsetHelper.getLayoutTop () сначала возвращает 0 вместо реальной верхней 24dp, потому что в это время метод onViewLayout offsetHelper не был вызван, он будет вызван после вычисления свернутой позиции заголовка.
// Update our child view offset helpers. This needs to be done after the title has been
// setup, so that any Toolbars are in their original position
for (int i = 0, z = getChildCount(); i < z; i++) {
getViewOffsetHelper(getChildAt(i)).onViewLayout();
}
и, согласно комментарию, это поведение типа intend, onViewLayout должен вызываться после установки заголовка. Это точка, которую я не понимаю.
Я думаю, setSupportActionBar сделал что-то, чтобы onLayout снова вызывался, что пересчитает позицию заголовка с правильным LayoutTop. Поэтому я добавляю следующий код:
final CollapsingToolbarLayout v = findViewById(R.id.toolbar_layout);
v.post(new Runnable() {
@Override
public void run() {
v.requestLayout();
}
});
к методу onCreate действия, и проблема решена.
Теперь я оставлю этот вопрос открытым, так как не думаю, что это элегантное решение, и, возможно, есть какой-то официальный способ решить эту проблему. Или это ошибка, которую разработчик Android не знает?