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);
}
}
};
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);
}
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);
} });
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.
Je suggère d'essayer trois choses indépendantes.
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);
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.
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