66

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

11 回答 11

124

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

你也不应该使用:

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

仅使用两者之一。来自Android 文档

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);
}
于 2011-09-08T13:08:53.890 回答
14

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

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()

于 2017-01-03T23:16:52.263 回答
12

您可以将其视为 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>
于 2013-03-04T11:10:35.463 回答
6

首先看你的代码:

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

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

于 2011-09-08T13:00:58.507 回答
4

就我而言,我发现在将可见性设置为GONE有效之前,只需清除视图上的动画即可。

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

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

于 2019-08-29T07:38:07.943 回答
1

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

我认为这应该很容易工作。希望这可以帮助。

于 2018-02-28T11:22:00.087 回答
1

这适用于尝试了所有答案但仍然失败的人。扩展皮埃尔的答案。如果您正在使用动画,则将可见性设置为GONEorINVISIBLEinvalidate()将永远不会起作用。试试下面的解决方案。`

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

`

于 2019-11-24T14:16:21.397 回答
1

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

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

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
于 2016-08-30T11:50:10.260 回答
0

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

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

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

这为我解决了这个问题。

于 2020-10-21T12:58:00.657 回答
0

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

于 2020-11-13T11:19:25.327 回答
-25

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

于 2011-09-08T12:44:07.880 回答