2012-06-27 15 views
15

Estoy tratando de mostrar un par de botones ocultos (usando setVisibility(View.VISIBLE), dentro de un RelativeLayout), pero no siempre funciona. El botón muestra OK en una Galaxy Tab 10.1 "pero no en una tableta más pequeña (no estoy seguro de qué modelo), ni en un emulador de Android 4.0.setVisibility (View.VISIBLE) no siempre funciona. Ideas?

Descubrí al azar que, para un cierto TextView t, el siguiente código causa los botones a hacerse visibles:

t.setText(t.getText()); 
... 
button.setVisibility(View.VISIBLE); 

t se encuentra en la misma RelativeLayout pero no está relacionado con los botones (sus ubicaciones son independientes y que no se solapan)

Editar:. en caso de que algunos dev Android quiere para rastrear esto ...

Pude reducir el código al siguiente diseño que muestra el problema en un emulador de Android 4.0.3 pero no en un Galaxy Tab. Encontré que necesito un SurfaceView o el problema no ocurre (por ejemplo, cámbielo a TextView y el problema desaparece).

<?xml version="1.0" encoding="utf-8"?> 
<!-- layout/test.xml --> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"   
    android:id="@+id/relativeLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <SurfaceView 
     android:id="@+id/mapCtrl" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_above="@+id/bottomPanel" 
     android:text="Placeholder" 
     android:layout_marginTop="18dip" /> 
    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:text="@string/map_mode_title" /> 

    <!--=================================================--> 
    <!-- Bottom bar: current road name and current speed --> 
    <LinearLayout 
     android:id="@+id/bottomPanel" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:background="#f228" 
     android:orientation="horizontal" 
     android:textColor="#ffff" > 
     <Button 
      android:id="@+id/btnNavMode" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_marginRight="3dip" 
      android:textColor="#fff" 
      android:text="Switch to\nNav Mode" /> 
     <RelativeLayout 
      android:id="@+id/currentStreetPanel" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:clickable="true" 
      android:orientation="vertical" > 
      <TextView 
       android:id="@+id/currentStreetHdg" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentTop="true" 
       android:text="Current street" 
       android:textColor="#fff" 
       android:textSize="10dip" /> 
      <TextView 
       android:id="@+id/currentStreet" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_below="@+id/currentStreetHdg" 
       android:layout_marginTop="-8dip" 
       android:singleLine="true" 
       android:text="Current street" 
       android:textColor="#fff" 
       android:textSize="30dip" /> 
     </RelativeLayout> 
     <RelativeLayout 
      android:id="@+id/RelativeLayout2" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:background="#ff606060" 
      android:orientation="vertical" > 
      <TextView 
       android:id="@+id/yourSpeedHdg" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentTop="true" 
       android:layout_marginLeft="3dip" 
       android:text="Your speed" 
       android:textColor="#fff" 
       android:textSize="10dip" /> 
      <TextView 
       android:id="@+id/speed" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_below="@+id/yourSpeedHdg" 
       android:layout_marginLeft="3dip" 
       android:layout_marginTop="-8dip" 
       android:text="0" 
       android:textColor="#fff" 
       android:textSize="30dip" /> 
      <TextView 
       android:id="@+id/speedUnit" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignBaseline="@+id/speed" 
       android:layout_marginLeft="5dip" 
       android:layout_toRightOf="@+id/speed" 
       android:text="kph" 
       android:textColor="#fff" 
       android:textSize="18dip" /> 
     </RelativeLayout> 
    </LinearLayout> 

    <!--================--> 
    <!-- On-map buttons --> 
    <Button 
     android:id="@+id/btnClearRoute" 
     android:background="#F00" 
     android:textColor="#fff" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Clear\nroute"/> 
    <ZoomControls 
     android:id="@+id/zoomControls" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/mapCtrl" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="-25dip" 
     android:orientation="horizontal" /> 
    <Button 
     android:id="@+id/btnFindRoute" 
     android:layout_width="100dip" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/mapCtrl" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="2dip" 
     android:layout_marginBottom="65dip" 
     android:text="Route to selected location" 
     android:textSize="17dip"/> 
    <Button 
     android:id="@+id/btnUnselect" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/btnFindRoute" 
     android:layout_alignTop="@+id/btnFindRoute" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="2dip" 
     android:text="Unselect" /> 
    <LinearLayout 
     android:id="@+id/showMePanel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/btnFindRoute" 
     android:layout_alignRight="@+id/btnFindRoute" 
     android:layout_alignLeft="@+id/btnFindRoute" 
     android:padding="4dip" 
     android:background="#bbbb" 
     android:gravity="center" 
     android:orientation="vertical"> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Show me..." 
      android:textColor="#fff"/> 
     <Button 
      android:id="@+id/btnShowVehicle" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="My car"/> 
     <Button 
      android:id="@+id/btnShowRoute" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="The route"/> 
     <Button 
      android:id="@+id/btnShowDestination" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Destination"/> 
     <Button 
      android:id="@+id/btnShowMap" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="The map"/> 
    </LinearLayout> 
</RelativeLayout> 

La clase de actividad simplemente cambia la visibilidad de los dos botones cuando se hace clic en cualquiera de los botones. Nuevamente, en algunos dispositivos funciona, en otros no funciona.

package mentor.simplegps; 

import android.app.*; 
import android.os.Bundle; 
import android.view.*; 
import android.widget.*; 

public class TestActivity extends Activity implements View.OnClickListener 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.test); 
     boilerplate(); 
     setVisibilities(); 
    } 

    Button _btnShowMap, _btnShowVehicle, _btnShowRoute, _btnShowDestination; 
    Button _btnUnselect, _btnFindRoute, _btnNavMode; 
    TextView _title; 

    void boilerplate() 
    { 
     _btnUnselect = attachBtn(R.id.btnUnselect); 
     _btnShowMap = attachBtn(R.id.btnShowMap); 
     _btnShowVehicle = attachBtn(R.id.btnShowVehicle); 
     _btnShowRoute = attachBtn(R.id.btnShowRoute); 
     _btnShowDestination = attachBtn(R.id.btnShowDestination); 
     _btnFindRoute = attachBtn(R.id.btnFindRoute); 
     _btnNavMode = attachBtn(R.id.btnNavMode); 
     _title = (TextView)findViewById(R.id.title); 
    } 
    private Button attachBtn(int btnId) { 
     Button b = (Button)findViewById(btnId); 
     b.setOnClickListener(this); 
     return b; 
    } 

    boolean haveSel; 
    public void onClick(View v) 
    { 
     haveSel = !haveSel; 
     setVisibilities(); 
    } 
    void setVisibilities() 
    { 
     _btnFindRoute.setVisibility(haveSel ? View.VISIBLE : View.INVISIBLE); 
     _btnUnselect.setVisibility (haveSel ? View.VISIBLE : View.INVISIBLE); 

     // Fixes the problem 
     //_title.setText(_title.getText()); 
    } 
} 

Respuesta

36

SurfaceView es la única culpable (por supuesto, esto también se aplica a GLSurfaceView, RSSurfaceView y VideoView, todos los cuales hereda de SurfaceView). Expone una gran cantidad de comportamientos extraños cuando se trata de otros puntos de vista en la parte superior. Jugar con View.setVisibility() es uno de esos problemas. Claramente, SurfaceView no ha sido diseñado para ser utilizado con otras vistas (a pesar de que el documento oficial dice que debería ser), sino como una vista independiente para videos, juegos o productos OpenGL.

Para el problema de visibilidad, he encontrado que con View.GONE en lugar de View.INVISIBLE lo resuelve. Si no desea utilizar GONE, intente cambiar el enfoque, por ejemplo (y vuelva al que tenía el foco antes), o cambie otros estados. El objetivo es despertar el sistema de IU subyacente de alguna manera.

En resumen: cuando sucede algo extraño con sus vistas y tiene SurfaceView (o subclase) en alguna parte, intente reemplazarlo por otra cosa para no perder horas buscando lo que está haciendo mal cuando lo está haciendo es correcto (y no hay creencias falsas). De esta forma, sabes que SurfaceView es el culpable y puedes hackearlo con hermosos comentarios para mear sin reparos.

+0

Gracias funcionó bien! Podría marcarse como una respuesta ... –

+0

Tuve una situación similar, pero sin participación de SurfaceView. Intentar alternar entre INVISIBLE y VISIBLE no funcionó. Pero ido a lo visible lo hizo. Imagínate. –

+0

Intenté GONE/VISIBLE en la vista que superposición en la parte superior de SurfaceView con el tamaño principal coincidente, pero no funcionó, finalmente tengo que hacer SurfaceView GONE. – Prakash

13

Para el registro: Tuve este problema, intenté un montón de cosas al azar (¡gracias Alex!), Y en mi caso lo resolví haciendo seekBar.requestLayout() directamente después del setVisible en la barra de búsqueda que se negaba a mostrar.

+0

¡genial! :) esto funciona para mí. Estaba escondiendo un botón en la cámara, y cuando necesité mostrarlo lo puse en el botón visible y requestLayout –

0

En mi caso View.VISIBLE/View.GONE no funcionaba siempre. Cuando cambié mi alternador a View.VISIBLE/View.INVISIBLE, comenzó a funcionar como estaba previsto.

0

I (molestamente) tuve una dificultad similar al tener un botón en la parte superior de una vista previa de SurfaceView y tuve que poner el botón en un RelativeLayout y hacer que RelativeLayout VISIBLE/INVISIBLE. Podría valer la pena una oportunidad para que otra persona tenga el mismo problema.

... Y también tuve que llamar programáticamente al diseño que se va a traer desde: buttonLayout.bringToFront() justo después de findViewById.

1

Esta es mi solución

setAlpha(0) 
btnName.setAlpha(0) 

está trabajando para todos los puntos de vista como => Botones - Imágenes - Textos y ...

Cuestiones relacionadas