2011-12-06 16 views
6

Estoy tratando de crear un ViewGroup personalizado, y quiero usarlo con una aplicación de pantalla completa. Estoy utilizando el "requestWindowFeature (Window.FEATURE_NO_TITLE)" para ocultar la barra de título. La barra de título no se muestra, pero sigue consumiendo espacio en la parte superior de la ventana.Android: Usar FEATURE_NO_TITLE con ViewGroup personalizado deja espacio en la parte superior de la ventana

Here is a picture of the problem

La imagen de arriba fue generado con el siguiente código:

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)

Es interesante ver que es el Android que se da este espacio para mi diseño personalizado. Estoy configurando el CustomLayout como el diseño raíz de mi actividad. En el inicio de sesión, "onLayout" recibe "t = 25", y eso es lo que está empujando mi diseño hacia abajo. Lo que no sé es qué estoy haciendo mal que hace que Android sea "t = 25" (que es exactamente el alto de la barra de título).

Estoy ejecutando este código en el Android SDK 2.1, pero también sucede en Android 2.2.


EDITAR: Si cambio de la clase CustomLayout por alguna disposición por defecto (como LinearLayout), el espacio desaparece. Por supuesto, los diseños predeterminados de Android SDK no crean el diseño que intento crear, por eso es por lo que estoy creando uno.

Aunque el diseño que estoy creando es algo complejo, este es el código más pequeño que pude crear reproduciendo el problema que tengo con mi diseño.

Respuesta

3

No es una respuesta completa, pero mientras tanto se puede evitar el problema envolviendo su diseño personalizado en un <FrameLayout />

Además, vale la pena señalar que su diseño se extiende más allá de la parte inferior de la pantalla. Se desplazó hacia abajo por la altura de la barra de título (38 píxeles en mi emulador)

Editar: Lo tengo. onLayout() (y el método de distribución correspondiente()) especifican que las coordenadas no son relativas al origen de la pantalla, sino que están relacionadas con el elemento principal (http://developer.android.com/reference/android/view/View.html#layout%28int,%20int,%20int,%20int%29). Entonces, el sistema le dice que está en coordenadas relativas (0, 38) y lo está agregando cuando se lo pasa a su hijo, lo que significa que está diciendo que su hijo está en las coordenadas de la pantalla (0, 76), causando la brecha.

Lo que realmente quiere hacer es:

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

que pondrá a su hijo Vistas alineados con la esquina superior izquierda de la vista, con la misma anchura y altura que su punto de vista.

+0

Gracias, @Hounshell. Me perdí este punto en los documentos sobre el sistema de coordenadas relativo al padre. Esta es una imagen de lo que quiero lograr (resultado de su comentario): [enlace] (http://i.imgur.com/FIOIG) – lgfischer

0

he tenido el mismo problema con un FrameLayout en 2.2

me fijo mediante la adición de android:layout_gravity="top" a la FrameLayout

Cuestiones relacionadas