Android: Why setVisibility (View.GONE);或 setVisibility(View.INVISIBLE);不工作

我希望我的和按钮在开始时不可见。当我按下我的魔术按钮时,我想设置可见度(View.Visible);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());
    }
});

答案 1

我看到很多错误的事情。对于初学者来说,你没有定义你的魔术按钮,也没有它的事件处理程序。

此外,您也不应使用:

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

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

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

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

在您的示例中,您将用一个任务覆盖该任务。View.GONEView.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);
}

答案 2

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

myViewGroup.setVisibility(View.GONE);

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

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

放置断点,你可以看到,可见性变为 ,但是在下一帧上,它神奇地变成了 。我试图理解这到底是怎么发生的。GONEVISIBLE

事实证明,有一个动画应用于此视图,这在内部导致视图将其可见性更改为,直到完成动画:VISIBLE

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

    myViewGroup.setVisibility(View.GONE);
}

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

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

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


推荐