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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top