如果最初设置为不可见,则不会显示android setVisibility

时间:2012-03-04 16:40:34

标签: android layout visibility

我的glsurface占据了整个屏幕。点击一个按钮,我想要出现另一个布局(设置类型的东西)。如果我从叠加层开始可见,我可以使它不可见,然后再次可见,没有任何问题。但是,如果我从它开始看不见,我不能让它再次可见。代码如下:

<?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);
        }
    }
};

10 个答案:

答案 0 :(得分:20)

有类似的错误,但这是由于我没有使用UiThread的愚蠢错误。

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

答案 1 :(得分:15)

知道了。您必须设置布局中所有项目的可见性,而不仅仅是布局。所以这段代码有效:

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);
}

答案 2 :(得分:6)

在我的情况下,使用普通的SurfaceView,我只是将视图设置为xml中的GONE,而不是INVISIBLE。然后我可以在此之后正确设置可见性。

答案 3 :(得分:2)

我建议尝试三件独立的事情。

  1. 更改布局宽度和高度以包装内容,因为它可能是匹配父级的问题。
  2. 在视图上调用bringToFront
  3. 在FrameLayout中包装surfaceView(这与#2有关,但它仍然有帮助)

答案 4 :(得分:1)

如果你将CalendarView设置为可见“VISIBLE”,并在inflateView / OnCreateView中找到它后,将“findById”设置为“GONE”,你可以随心所欲地使用它。

  

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

     

calendarView.setVisibility(View.VISIBLE);

答案 5 :(得分:0)

我也遇到了同样的问题,调试日志清楚地表明可见性已正确设置。

我正在使用数据绑定。对我来说,以下解决方案有效。

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

实际上,binding.getRoot().post(() -> {});完成了这项工作。

答案 6 :(得分:0)

我不解释为什么不起作用(对我来说也是如此),但是作为一种解决方法,您可以执行以下操作:

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

答案 7 :(得分:0)

在将2个视图放入LinearLayout中之前,我遇到了类似的问题。 这两个视图中的一个消失了,另一个可见。

当我试图使不可见的东西和可见的东西消失时, 它不起作用。

我通过使用RelativeLayout而不是LinearLayout作为容器布局解决了这个问题,然后就可以了。

答案 8 :(得分:0)

就我而言,我在可见性为 GONE

的元素中调用了 .setVisiblity(View.GONE)
 if (temp.getVisibility() == View.VISIBLE) {
            temp.setVisibility(View.GONE);
        }

做类似的事情对我有用。

答案 9 :(得分:-3)

case R.id.title_call_button:
if(llButtonCallNow.getVisibility() != View.VISIBLE){
llButtonCallNow.setVisibility(View.VISIBLE);
}
    else{
    llButtonCallNow.setVisibility(View.GONE);
    Toast.makeText(getBaseContext(), ("Im here baby :)"),
    Toast.LENGTH_SHORT).show();

    }
break;