web-dev-qa-db-fra.com

android setVisibility ne s'affiche pas s'il est initialement défini sur invisible

J'ai une glsurface occupant le plein écran. Au clic d'un bouton, je veux qu'une autre disposition apparaisse (type de paramètres de chose). Si je commence avec la superposition visible, je peux la rendre invisible puis visible à nouveau sans problème. Mais si je commence par l'invisible, je ne pourrai plus jamais le rendre visible. Le code suit:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >

    <Android.opengl.GLSurfaceView
    Android:id="@+id/glPlaySurface"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >
</Android.opengl.GLSurfaceView>

<RadioGroup
    Android:id="@+id/radioGroup1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:orientation="horizontal" >

    <RadioButton
        Android:id="@+id/btnRotate"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginLeft="10dp"
        Android:checked="true"
        Android:text="R"
        Android:textColor="#000" />

    <RadioButton
        Android:id="@+id/btnPan"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginLeft="15dp"
        Android:text="P"
        Android:textColor="#000" />
</RadioGroup>

<Button
    Android:id="@+id/btnLights"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_marginLeft="15dp"
    Android:layout_toRightOf="@+id/radioGroup1"
    Android:text="Lights" />

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/layoutLights"
    Android:layout_width="100dp"
    Android:layout_height="100dp"
    Android:visibility="visible" <--- Does not work if set to invisible
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentRight="true"

    Android:background="#fff" >

    <Button
    Android:id="@+id/btnLightsOK"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:layout_marginLeft="15dp"
    Android:text="OK" />

    <Button
    Android:id="@+id/btnLights"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:layout_marginLeft="15dp"
    Android:text="OK" />

</RelativeLayout>

</RelativeLayout>


private OnClickListener mOnLightsClick = new OnClickListener() {
    public void onClick(View arg0) {
        if(mLayoutLights.getVisibility() == View.VISIBLE) {
            mLayoutLights.setVisibility(View.INVISIBLE);
        }
        else {
            mLayoutLights.setVisibility(View.VISIBLE);
        }
    }
};
21
user1248322

Je l'ai. Vous devez définir la visibilité de tous les éléments de la mise en page, pas seulement la mise en page. Donc, ce code a fonctionné:

if (mLayoutLights.getVisibility() == View.VISIBLE) {
    ((Button) findViewById(R.id.btnLightsOK)).setVisibility(View.GONE);
((Button) findViewById(R.id.btnLightsCnc)).setVisibility(View.GONE);
mLayoutLights.setVisibility(View.GONE);
} else {
    mLayoutLights.setVisibility(View.VISIBLE);
((Button) findViewById(R.id.btnLightsOK)).setVisibility(View.VISIBLE);
((Button) findViewById(R.id.btnLightsCnc)).setVisibility(View.VISIBLE);
}
15
user1248322

J'ai eu une erreur similaire, mais elle était due à ma stupide erreur de ne pas utiliser l'UiThread.

Activity act = (Activity)context;
act.runOnUiThread(new Runnable(){
@Override
public void run() {
    mLayoutLights.setVisibility(View.VISIBLE);  
} });
27
Martin Sykes

Dans mon cas, avec une SurfaceView simple, je viens de définir la vue sur GONE en xml, pas INVISIBLE. Ensuite, je peux définir correctement la VISIBILITÉ après cela.

10
Thomas

Je suggère d'essayer trois choses indépendantes.

  1. Changer la largeur et la hauteur de la mise en page pour envelopper le contenu car cela pourrait être un problème avec la correspondance avec le parent.
  2. Appeler bringToFront sur la vue
  3. Envelopper la surfaceView dans un FrameLayout (cela est lié à # 2, mais cela pourrait quand même aider)

si vous définissez CalendarView sur visibilité "VISIBLE" et dans inflateView/OnCreateView après l'avoir trouvé avec "findById", définissez simplement "GONE" et vous pouvez faire ce que vous voulez avec.

calendarView = (CalendarView) view.findViewById (R.id.all_scores_calendar_view); calendarView.setVisibility (View.GONE);

calendarView.setVisibility (View.VISIBLE);

1
Idan Damri

J'ai rencontré le même problème et le journal de débogage montrait clairement que la visibilité était correctement définie.

J'utilisais la liaison de données. Pour moi, la solution ci-dessous a fonctionné.

activity.runOnUiThread(() -> binding.getRoot().post(() -> {
    binding.additionalDataHolderOne.setVisibility(View.GONE);
    binding.firstStreamHolder.setVisibility(View.VISIBLE);
}));

En fait, binding.getRoot().post(() -> {}); a fait le travail.

0
Ifta

Je ne sais pas pourquoi ne fonctionne pas (pour moi aussi) mais comme solution de contournement, vous pouvez le faire:

 val params = mLayoutLights.layoutParams
    if (shoouldShow()) {
        params.height = WRAP_CONTENT
    } else {
        params.height = 0
    }
    mLayoutLights.layoutParams = params
0
mspapant