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

我希望我的 DatePicker和按钮在开始时是隐形的。当我按下我的魔术按钮,我想设置可见性(视图。可见) ;

这里的问题是,当我的 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());
}
});
307381 次浏览

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

首先看看你的代码:

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

这里您将两个可见性设置为同一个字段,所以这就是问题所在。 我给出了一个示例演示

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

此外,你也不应该使用:

dp2.setVisibility(View.GONE);
dp2.setVisibility(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);

今天我设想了一个场景,我表演了以下内容:

myViewGroup.setVisibility(View.GONE);

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

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

放置断点,你可以看到,可见性改变到 GONE,但是在下一帧,它神奇地变成了 VISIBLE。我只是想知道怎么会发生这种事。

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

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


myViewGroup.setVisibility(View.GONE);
}

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

因此,如果遇到这样的情况,请确保在动画视图过程中没有执行 if检入。

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

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

您首先在同一视图中使用 GONE,然后使用 INVISABLE。因为代码是按顺序执行的,首先视图变为 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);
final Button btn3 = (Button) findViewById(R.id.btnVisibility);


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


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

我觉得这个应该很简单,希望能有帮助。

在我的例子中,我发现在设置 GONE的可见性之前简单地清除视图上的动画就可以了。

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

我有一个类似的问题,我切换之间的两个视图,其中一个必须始终开始作为 GONE-但当我显示的视图再次,它显示在第一个视图,即使 setVisibility(GONE)被调用。在将视图设置为 GONE之前清除动画可以正常工作。

这首歌献给那些尝试了所有答案但仍然失败的人。扩展 Pierre 的应答。如果您使用动画,设置可见性的 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) {
}
});

`

我也面临着同样的问题,如果假设特定的片段在不同的屏幕上膨胀,有可能 if 语句中设置的可见性模式不能根据我们的需要运行,因为条件可能已经在我们的应用程序中膨胀了很多次时被重置。

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

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

解决了我的问题。

我以前也遇到过同样的问题。在更改可见性之后调用无效几乎总是有效的,但是在某些情况下它不起作用。我不得不作弊,把背景设置为透明图像,把文字设置为“”。