2011-12-06 25 views
6

Sto cercando di creare un ViewGroup personalizzato e desidero utilizzarlo con un'applicazione a schermo intero. Sto usando "requestWindowFeature (Window.FEATURE_NO_TITLE)" per nascondere la barra del titolo. La barra del titolo non viene visualizzata, ma sta ancora consumando spazio in cima alla finestra.Android: utilizzando FEATURE_NO_TITLE con ViewGroup personalizzato lascia spazio sulla parte superiore della finestra

Here is a picture of the problem

L'immagine sopra è stata generata con il seguente codice:

public class CustomLayoutTestActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     Button b = new Button(this); 
     b.setText("Hello"); 
     CustomLayout layout = new CustomLayout(this); 
     layout.addView(b); 
     setContentView(layout); 
    } 
} 

public class CustomLayout extends ViewGroup { 
    public CustomLayout(Context context) { 
     super(context); 
    } 
    public CustomLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    public CustomLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 
    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     Log.i("CustomLayout", "changed="+changed+" l="+l+" t="+t+" r="+r+" b="+b); 
     final int childCount = getChildCount(); 
     for (int i = 0; i < childCount; ++i) { 
      final View v = getChildAt(i); 
      v.layout(l, t, r, b); 
     } 
    } 
} 

(The full Eclipse project is here)

E 'interessante vedere che è l'Android che viene dato questo spazio per la mia layout personalizzato. Sto impostando CustomLayout come layout principale della mia attività. Nel Log in "onLayout" sta ricevendo "t = 25", e questo è ciò che sta spingendo il mio layout verso il basso. Quello che non so è che cosa sto facendo male che rende Android il "t = 25" (che è esattamente l'altezza della barra del titolo).

Sto eseguendo questo codice in Android SDK 2.1, ma succede anche in Android 2.2.


EDIT: Se cambio la classe customLayout per alcuni layout di default (come LinearLayout), lo spazio scompare. Naturalmente, i layout predefiniti di Android SDK non creano il layout che sto cercando di creare, ecco perché ne sto creando uno.

Sebbene il layout che sto creando sia piuttosto complesso, questo è il codice più piccolo che potrei creare riproducendo il problema che ho con il mio layout.

risposta

3

Non è una risposta completa, ma nel frattempo è possibile aggirare il problema avvolgendo il layout personalizzato in un <FrameLayout />

Inoltre, vale la pena notare che il layout si estende oltre la parte inferiore dello schermo. È spostato verso il basso dall'altezza della barra del titolo (38 pixel nel mio emulatore)

Modifica: Capito. onLayout() (e il corrispondente metodo layout()) specificano che le coordinate non sono relative all'origine dello schermo, sono relative al genitore (http://developer.android.com/reference/android/view/View.html#layout%28int,%20int,%20int,%20int%29). Quindi il sistema ti sta dicendo che sei a coordinate relative (0, 38), e lo stai aggiungendo quando lo passi a tuo figlio, il che significa che stai dicendo che tuo figlio ha coordinate sullo schermo (0, 76), causando il divario.

cosa si vuole realmente fare è:

v.layout(0, 0, r - l, b - t); 

che metteranno il vostro bambino Visualizzazioni allineato con l'angolo superiore sinistro della vista, con la stessa larghezza e altezza del punto di vista.

+0

Grazie, @Hounshell. Ho perso questo punto sui documenti sul sistema di coordinate relativo al genitore. Questa è l'immagine di ciò che voglio ottenere (risultato del tuo commento): [link] (http://i.imgur.com/FIOIG) – lgfischer

0

Ho avuto lo stesso problema con un FrameLayout in 2,2

ho riparato aggiungendo android:layout_gravity="top" al FrameLayout

Problemi correlati