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

nay*_*den 51 java android android-datepicker android-layout android-view

我希望我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());
    }
});
Run Code Online (Sandbox Code Playgroud)

con*_*n_9 106

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

你不应该使用:

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE); 
Run Code Online (Sandbox Code Playgroud)

仅使用两者中的一个.来自Android文档:

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

View.INVISIBLE此视图不可见,但它仍占用布局空间.

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


尝试更换:

final DatePicker dp2 = new DatePicker(this)
Run Code Online (Sandbox Code Playgroud)

有:

DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);  
Run Code Online (Sandbox Code Playgroud)

与其他小部件类似:

    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);
}
Run Code Online (Sandbox Code Playgroud)

  • API表示"GONE:此视图不可见,并且不需要任何空间用于布局".并且"不可见:这个视图是不可见的,但它仍然占用了用于布局的空间." 使用哪一个符合您的需求. (3认同)

az3*_*az3 9

您可以将其视为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>
Run Code Online (Sandbox Code Playgroud)


Par*_*han 6

首先看看你的代码:

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
Run Code Online (Sandbox Code Playgroud)

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


azi*_*ian 6

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

myViewGroup.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

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

if(myViewGroup.getVisibility() == View.VISIBLE) {
    // this if check was fulfilled magically
}
Run Code Online (Sandbox Code Playgroud)

将断点GONE放在您看到的位置,可见性将变为,但在下一帧它就神奇地变为VISIBLE。我试图了解这种情况怎么发生。

原来有一个动画应用于此视图,该动画在内部导致该视图更改其可见性,VISIBLE直到完成动画为止:

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

    myViewGroup.setVisibility(View.GONE);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 谢谢!我花了很多时间来弄清楚为什么可见性不起作用,而您的解决方案对我有用! (2认同)

Pie*_*rre 6

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

dp2.clearAnimation();
dp2.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

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