2012-05-21 16 views
7

dado:Android - fragmento/ocultar mostrar deja un área vacía

  1. Dos elementos colocados verticalmente en la pantalla (ViewPager y el fragmento)
  2. Acción en el primer fragmento seleccionado actualmente (ViewFlipper) alterna entre en texto vista basada en WebView y en el fragmento superior y oculta/muestra el fragmento inferior.

Observado:

  1. ocultar el fragmento inferior deja un espacio vacío donde se encuentra el fragmento inferior.

He intentado tanto relativa y LinearLayout (con la parte superior fragmento establecido en weight=1) pero ambos tienen ningún efecto después del fragmento de fondo está eliminado todavía tengo espacio vacío en la parte inferior

Aquí hay archivo de diseño de nivel superior:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" android:layout_weight="1"/> 

<!-- This gets replaced with appropriate fragment at run time --> 
<LinearLayout 
    android:id="@+id/scrollFragmentPlaceholder" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="110dip" /> 
</LinearLayout> 

aquí es código que activa o desactiva el fragmento

Fragment scroll = getSupportFragmentManager().findFragmentById(R.id.scrollFragment); 
    if (scroll.isHidden() == isWebView) 
     return; // already handled, do nothing 
    FragmentTransaction tr = getSupportFragmentManager().beginTransaction(); 
    if (scroll != null && scroll.isAdded()) { 
     if (isWebView) { 
      tr.hide(scroll); 
     } else 
      tr.show(scroll); 
    } 
    tr.commit(); 

Y aquí cómo se ve: Bottom fragment is hidden

+0

has necesitado hacer .measure *() en la opinión de que sigue siendo ? – Codeman

+0

No realmente, pero si invierto el orden y muestro la versión de texto/ocultar abajo, se muestra correctamente – Bostone

+0

WebView para Android es bastante extraño. ¿Podría incluir algunas capturas de pantalla para que pueda ver de qué está hablando más específicamente? También necesita tener layoutWeight = 1 en ambas vistas si desea que ocupen la mitad del espacio disponible. También debe asegurarse de especificar orientation = "vertical" en la vista principal. – Codeman

Respuesta

16

Un mes después, descubrí cómo hacerlo. Resulta que simplemente ocultar el fragmento no es suficiente, básicamente necesito ocultar/mostrar el caparazón que contiene el fragmento. Sigue siendo el LinearLayout que originalmente se definió en XML. De hecho, es suficiente para establecer la visibilidad en ese diseño original para mostrar/ocultar el fragmento. Por lo que el código de la pregunta ahora se ve así:

public void onJobViewToggled(final boolean isWebView) { 
    if (isFinishing()) 
     return; 
    final Fragment scroll = getSupportFragmentManager().findFragmentById(R.id.scrollFragment); 
    if (scroll.isHidden() == isWebView) 
     return; // already handled, do nothing 
    final FragmentTransaction tr = getSupportFragmentManager().beginTransaction(); 
    if (scroll != null && scroll.isAdded()) { 
     if (isWebView) { 
      tr.hide(scroll); 
      // shell is the original placeholder 
      shell.setVisibility(View.GONE); 
     } else { 
      tr.show(scroll); 
      shell.setVisibility(View.VISIBLE); 
     } 
    } 
    tr.commit(); 
} 

Tenga en cuenta que todavía desea mostrar/ocultar el fragmento para que esto funcione

+1

¿Cómo vas a obtener el caparazón? – Nick

Cuestiones relacionadas