Jelly Bean android.R.id.content mudou?
-
11-12-2019 - |
Pergunta
Recentemente testei meu aplicativo em um dispositivo Jelly Bean e percebi que meu Actionbar Dodging Code não funciona mais.
Eu tenho uma Actionbar transparente com OverlayMode true, mas quero comportar a Actionbar como uma barra de ação sólida em algumas de minhas telas.
Para fazer isso funcionar, peguei emprestado algum código da Honeycomb Gallery Código
Basicamente, eu verifico a altura do Acionbar e defino o topMargin do bucket android.R.id.content com esse valor.
public void setupActionbar() {
final int sdkVersion = Build.VERSION.SDK_INT;
int barHeight = getSupportActionBar().getHeight();
if (sdkVersion < Build.VERSION_CODES.HONEYCOMB) {
FrameLayout content = (FrameLayout) findViewById(android.R.id.content);
RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) content.getLayoutParams();
if (params.topMargin != barHeight) {
params.topMargin = barHeight;
content.setLayoutParams(params);
}
if (!getSupportActionBar().isShowing()) {
params.topMargin = 0;
content.setLayoutParams(params);
}
} else {
FrameLayout content = (FrameLayout) findViewById(android.R.id.content);
LayoutParams params = content.getLayoutParams();
if (params instanceof RelativeLayout.LayoutParams) {
android.widget.RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) params;
if (lp.topMargin != barHeight) {
lp.topMargin = barHeight;
content.setLayoutParams(lp);
}
if (!getActionBar().isShowing()) {
lp.topMargin = 0;
content.setLayoutParams(lp);
}
} else if (params instanceof FrameLayout.LayoutParams) {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) params;
if (lp.topMargin != barHeight) {
lp.topMargin = barHeight;
content.setLayoutParams(params);
}
if (!getActionBar().isShowing()) {
lp.topMargin = 0;
content.setLayoutParams(params);
}
}
}
Em Jelly Beans esta estratégia não funciona mais por algum motivo.O Jelly Bean mudou as características do id.content Container?
Solução
Ok, respondendo minha própria pergunta aqui.Primeiro, cometi um erro de digitação no meu código:
content.setLayoutParams(params); should read
content.setLayoutParams(lp);
Mas o verdadeiro problema era que
FrameLayout content = (FrameLayout) findViewById(android.R.id.content);
fornecer a visualização de toda a tela, incluindo o Barra de status. Somente no Android 4.1 Jelly Bean
View content = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
fornece o RootContentView que precisa ser colocado na barra de ação transparente.