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

我想我的DatePicker和button在开始时是不可见的。 当我按下我的魔法button,我想setVisibility(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()); } }); 

我看到很多不对的地方 对于初学者,你没有定义你的魔法button,没有事件处理程序。

你也不应该使用:

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

只使用其中的一个。 从Android文档 :

View.GONE这个视图是不可见的,它不占用任何空间用于布局。

View.INVISIBLE这个视图是不可见的,但它仍然占用空间用于布局。

在你的例子中,你正在用View.INVISIBLE之一重写View.GONE赋值。


尝试更换:

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

您可以将其视为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> 

先看看你的代码:

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

在这里,你将两个可见性设置为相同的字段,所以这是问题。 我给这个样本演示一个样本

View.GONE这个视图是不可见的,它不占用任何空间用于布局。

View.INVISIBLE这个视图是不可见的,但它仍然占用空间用于布局。

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

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

 myViewGroup.setVisibility(View.GONE); 

就在下一个框架中,我正在执行一个if检查其他地方的可见性状态的视图。 你猜怎么着? 以下情况通过:

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

放置你看到的断点,可见性变为GONE ,但在下一帧它正好变成可见。 我想知道这到底会怎样。

结果发现有一个animation应用于这个视图,这个animation在内部导致视图改变它对VISIBLE的可见性直到完成animation:

 public void someFunction() { ... TransitionManager.beginDelayedTransition(myViewGroup); ... myViewGroup.setVisibility(View.GONE); } 

如果你debugging,你会看到myViewGroup确实将其可见性更改为GONE ,但在下一帧,它将再次变得可见,以便animation运行。

所以,如果遇到这种情况,请确保在animation视图中不执行if检查。

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

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