Domanda

Ho recentemente testato la mia app su un dispositivo di jelly bean e ho notato che il mio codice di schivare il mio codice ActionBar non funziona più.

Ho una barra action trasparente con OverlayMode True ma vuoi comportarsi la barra delle azioni come una solida barra d'azione in alcuni dei miei schermi.

Per fare questo lavoro ho preso in prestito qualche codice dalla galleria a nido d'ape Codice

Proprio di base con controllo dell'altezza dell'acionbar e imposta il topmargin del secchio Android.r.id.Content a questo valore.

  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);
          }
        }

      }
.

In Jelly Beans questa strategia non funziona più per qualche motivo.Jelly Bean ha cambiato il contenitore ID.Content Perhabs?

È stato utile?

Soluzione

OK rispondendo alla mia stessa domanda qui. Per prima cosa ho avuto un errore di battitura nel mio codice:

content.setLayoutParams(params); should read
content.setLayoutParams(lp);
.

Ma il problema reale era quello

FrameLayout content = (FrameLayout) findViewById(android.R.id.content);
.

Fornisci la vista dell'intero schermo, inclusa la barra di stato . solo su Android 4.1 Jelly Bean

View content = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
.

Dà il rootcontentview che deve essere spinto sotto la barra action trasparente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top