2011-10-25 13 views
18

windowIsFloating mientras que una gran ventanilla única para crear Dialog UI de estilo tiene muchos --- bugs --- quirks.Cómo crear una actividad transparente SIN windowIsFloating

La que estoy luchando en este momento es que se asigna el ancho/altura del ancestro superior como "wrap_content "en lugar de la anchura/altura de la pantalla. Esto significa que el diseño de la interfaz de usuario habitual de utilizar "match_parents" se propagan hacia arriba .. para convertirse en "wrap_content" malos tiempos

Por lo tanto, lo que realmente me gustaría es crear una actividad, y tienen un diseño de este modo:

<LinearLayout android:layout_height="wrap_content" 
       android:layout_width="match_parent" 
       android:orientation="vertical" 
       android:id="@+id/containerPageConatiner" 
       android:background="@drawable/windowBackground"> 
    <View   android:layout_width="match_parent" 
        android:layout_height="0dp" 
        android:layout_weight="1"/> 
    <FrameLayout android:id="@+id/singlePane" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:layout_gravity="center_horizontal|center_vertical" 
        android:padding="10dp"/>  
    <View   android:layout_width="match_parent" 
        android:layout_height="0dp" 
        android:layout_weight="1"/>       
</LinearLayout> 

que produce una interfaz de usuario que muestra una única ventana (@ id/singlePane) ontop de la Actividad que lo llamó.

¿Alguien tiene el justo conjunto de estilos necesarios para crear un fondo transparente Actividad?

Respuesta

29

Gracias a @PolamReddy que me dio un codazo hacia la respuesta que quería:

El tema Theme.Translucent.NoTitleBar.Fullscreen y sus antepasados ​​contienen todos los atributos que necesita para crear una ventana translúcida. Con el fin de conseguir todo, aparte de windowIsFloating Fui a través de la pila ancestro y saque todo el conjunto de atributos:

<style name="Theme.CustomTheme.TransparentActivity"> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:colorBackgroundCacheHint">@null</item> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowAnimationStyle">@android:style/Animation</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowFullscreen">true</item> 
</style> 

Este estilo se debe asignar a la Activity en el AndroidManifest.xml en lugar de la vista raíz de un diseño.

6

uso como éste para la actividad en el archivo de manifiesto (tema representa la transparencia de esa actividad.)

<activity android:name=".Settings"  
      android:theme="@android:style/Theme.Translucent.NoTitleBar"/> 
0

La respuesta aceptada funciona bien, hasta que necesito tener un EditText dentro de la ventana de estilo de diálogo, ya que el teclado IME suave no presionaría el "diálogo" sin windowIsFloating. Así que tengo que abordar el 'error' de frente.

Como con el caso en la pregunta, necesito tener el ancho establecido en "match_parent" mientras que la altura puede permanecer "wrap_content". Con windowIsFloating, termino configurando un ViewTreeObserver, recorro el árbol de vista durante el diseño y forzo la ventana flotante al ancho deseado. El enfoque es el siguiente (bajo onCreate() de la Actividad) -

setContentView(contentView); 

// set up the ViewTreeObserver 
ViewTreeObserver vto = contentView.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    int displayWidth = -1; 
    DisplayMetrics metrics = null; 
    View containerView = null; 

    @Override 
    public void onGlobalLayout() {    
     if (containerView == null) { 
      // traverse up the view tree 
      ViewParent v = contentView.getParent(); 
      containerView = contentView; 
      while ((v != null) && (v instanceof View)) { 
       containerView = (View) v; 
       v = v.getParent(); 
      } 
     } 
     if (metrics == null) { 
      metrics = new DisplayMetrics(); 
     } 
     Display display = getWindowManager().getDefaultDisplay(); 
     display.getMetrics(metrics); 
     if (displayWidth != metrics.widthPixels) { 
      displayWidth = metrics.widthPixels; 
      WindowManager.LayoutParams params = 
        (WindowManager.LayoutParams) containerView.getLayoutParams(); 
      // set the width to the available width to emulate match_parent 
      params.width = displayWidth; 
      // windowIsFloating may also dim the background 
      // do this if dimming is not desired 
      params.dimAmount = 0f; 
      containerView.setLayoutParams(params); 
      getWindowManager().updateViewLayout(containerView, params); 
     } 
    } 
}); 

Esto funciona hasta androide 7 hasta el momento (incluso en modo de pantalla dividida), pero uno puede coger la posible excepción de difusión para la fundición a WindowManager.LayoutParams en el caso cambios futuros en la implementación, y agregue removeOnGlobalLayoutListener(); en un lugar apropiado.

Cuestiones relacionadas