Android:为什么setVisibility(View.GONE);或setVisibility(View.INVISIBLE);不工作

时间:2011-09-08 12:39:27

标签: java android android-layout android-view android-datepicker

我希望我的DatePicker和按钮在开始时不可见。当我按下魔术按钮时,我想设置可见性(View.Visible);

此处的问题是当我setVisibility(View.GONE)setVisibility(View.INVISIBLE)没有任何变化且组件仍然可见时。

final DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);
final Button btn2 = (Button) findViewById(R.id.btnDate2);

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);

btn2.setOnClickListener(new View.OnClickListener() {
    public void onClick(View arg0) {
        TextView txt2 = (TextView) findViewById(R.id.txt2);
        txt2.setText("You selected " + dp2.getDayOfMonth()
            + "/" + (dp2.getMonth() + 1) + "/" + dp2.getYear());
    }
});

12 个答案:

答案 0 :(得分:98)

我看到了很多错误。对于初学者,您没有定义魔术按钮,也没有事件处理程序。

另外你不应该使用:

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE); 

只使用其中一个。来自Android documentation

  

View.GONE此视图不可见,并且不占用任何空间   布局目的。

     

View.INVISIBLE此视图不可见,但仍然存在   占用空间用于布局目的。

在您的示例中,您将使用View.GONE覆盖View.INVISIBLE作业。


尝试更换:

final DatePicker dp2 = new DatePicker(this)

使用:

DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);  

与其他小部件类似:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);

        final DatePicker dp2 = new DatePicker(this);
        final Button btn2 = new Button(this);
        final Button magicButton = new Button(this);
        final TextView txt2 = new TextView(TestActivity.this);

        dp2.setVisibility(View.GONE);
        btn2.setVisibility(View.GONE);
        btn2.setText("set Date");

        btn2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                txt2.setText("You selected "
                    + dp2.getDayOfMonth() + "/" + (dp2.getMonth() + 1) 
                    + "/" + dp2.getYear());
            }
        });

        magicButton.setText("Magic Button");
        magicButton.setOnClickListener(new View.OnClickListener()    
            public void onClick(View arg0) {
                dp2.setVisibility(View.VISIBLE);
                btn2.setVisibility(View.VISIBLE);
            }
        });

    ll.addView(dp2);
    ll.addView(btn2);
    ll.addView(magicButton);
    ll.addView(txt2);

    setContentView(ll);
}

答案 1 :(得分:8)

您可以将其视为CSS样式的可见性&显示。

<div style="visibility:visible; display:block">
    This is View.VISIBLE : Content is displayed normally.
</div>

<div style="visibility:hidden; display:block">
    This is View.INVISIBLE : Content is not displayed, but div still takes up place, but empty.
</div>

<div style="display:none">
    This is View.GONE : Container div is not shown, you can say the content is not displayed.
</div>

答案 2 :(得分:6)

首先看你的代码:

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);

在这里,您可以将同一个字段的可见性设置为问题。 我为sample demo

提供了一个示例

答案 3 :(得分:4)

今天我有一个场景,我正在执行以下操作:

myViewGroup.setVisibility(View.GONE);

在下一帧的右侧,我正在其他地方执行if检查以查看该视图的可见性状态。你猜怎么着?以下条件正在通过:

if(myViewGroup.getVisibility() == View.VISIBLE) {
    // this if check was fulfilled magically
}

放置您看到的断点,该可见性会更改为GONE,但在下一帧中它会神奇地变为VISIBLE。我试图了解这是怎么回事。

原来有一个动画应用于这个视图,它在内部导致视图改变了它对VISIBLE的可见性,直到完成动画:

public void someFunction() {
    ...
    TransitionManager.beginDelayedTransition(myViewGroup);
    ...

    myViewGroup.setVisibility(View.GONE);
}

如果您进行调试,您会看到myViewGroup确实将其可见性更改为GONE,但在下一帧中,它将再次变为可见,以便运行动画。

因此,如果您遇到这种情况,请确保您没有在动画视图中执行if检查。

您可以通过View.clearAnimation()删除视图上的所有动画。

答案 4 :(得分:1)

View.GONE此视图不可见,并且不会占用任何空间用于布局。

View.INVISIBLE此视图不可见,但仍会占用空间以进行布局。

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);

答案 5 :(得分:1)

就我而言,我发现在将可见性设置为 <template v-slot:expand="props"> <v-card flat> <v-card flat="flat" color="dark"> <v-container fluid="fluid" grid-list-xl="grid-list-xl"> <v-layout row> <v-flex xs8>Pareigos ir krūvis: </v-flex> <v-flex xs4>Kategorijos: </v-flex> </v-layout> <v-layout row> <template v-for="pindex in props.item.position.length"> <v-flex xs3> <v-text-field class=" expandable" type="text" size="45" style="float:right" v-model="props.item.position[pindex - 1].position" /> </v-flex> <v-flex xs1> <v-text-field class="expandable" type="text" size="5" style="float:left" v-model="props.item.workload[pindex - 1]" /> </v-flex> </template> <v-spacer> </v-spacer> <v-flex xs4> <div> <v-text-field class=" expandable" type="text" v-model="props.item.categories" /> </div> </v-flex> </v-layout> </v-container> </v-card> </v-card> </template> 之前先清除视图上的动画即可。

GONE

我遇到了类似的问题,即我在两个视图之间切换,其中一个必须始终以dp2.clearAnimation(); dp2.setVisibility(View.GONE); 开始-但是当我再次显示视图时,即使{{1} } 被称为。将视图设置为GONE之前先清除动画即可。

答案 6 :(得分:0)

View.GONE使视图不可见,而视图不占用布局中的空间。 View.INVISIBLE使视图不可见仍然占用空间。

你首先在同一个视图上使用GONE然后INVISIBLE。因为代码是按顺序执行的,首先视图变为GONE然后被仍然占用空间的INVISIBLE类型覆盖。

您应该在按钮上添加按钮侦听器,并在onClick()方法内部使视图可见。这应该是你在onCreate()方法中根据我的逻辑。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_setting);

    final DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);
    final Button btn2 = (Button) findViewById(R.id.btnDate2);

    dp2.setVisibility(View.INVISIBLE);
    btn2.setVisibility(View.INVISIBLE);

    bt2.setOnClickListener(new View.OnCLickListener(){ 
    @Override
    public void onClick(View view)
    {
        dp2.setVisibility(View.VISIBLE);
        bt2.setVisibility(View.VISIBLE);
    }
  });
}

我认为这应该很容易。希望这会有所帮助。

答案 7 :(得分:0)

setVisibility也不适用于我

fabCamera.setVisibility(View.GONE);

那个错误是:

VisibilityAwareImageButton.setVisibility can only be called from within the same library group (groupId=com.google.android.material)

我在androidx中,尝试导入com.google.android.material,但没有成功

答案 8 :(得分:0)

这是给尝试过所有答案但仍然失败的人的。扩展pierre's答案。如果您正在使用动画,则将可见性设置为GONEINVISIBLEinvalidate()永远不会起作用。试用以下解决方案。 `

btn2.getAnimation().setAnimationListener(new Animation.AnimationListener() {
     @Override
     public void onAnimationStart(Animation animation) {
     }
     @Override
     public void onAnimationEnd(Animation animation) {
         btn2.setVisibility(View.GONE);
         btn2.clearAnimation();
     }
     @Override
     public void onAnimationRepeat(Animation animation) {
     }
});

`

答案 9 :(得分:0)

我也面临着同样的问题,如果假设特定的片段在各个屏幕上膨胀,那么if语句中设置的可见性模式就有可能无法根据我们的需要运行,因为该条件可能在重置时它在我们的应用中膨胀了很多次。

就我而言,我必须根据在另一个片段(父片段)中单击的按钮来更改一个片段(子片段)中的可见性模式。因此,我将buttonClicked布尔值存储在父片段的变量中,并将其作为参数传递给子片段中的函数。因此,子片段中的可见性模式将根据通过参数接收的布尔值进行更改。但是,由于此子片段在各个屏幕上膨胀,即使我使用View.GONE将其隐藏,可见性模式仍会继续重置。

为了避免这种冲突,我在子片段中声明了一个静态布尔变量,并且每当从父片段接收到该布尔值时,我便将其存储在该静态变量中,然后根据该静态变量更改可见性模式。子片段。

那为我解决了这个问题。

答案 10 :(得分:0)

我曾经遇到过同样的问题。更改可见性后调用无效几乎总是可行的,但在某些情况下则无效。我不得不作弊,并将背景设置为透明图像,并将文本设置为“”。

答案 11 :(得分:-23)

因为您将可见性设置为true或false。 试试看 setVisible(0)显示为真。 and setVisible(4)显示为false。