Android: почему setVisibility(просмотр.GONE); или setVisibility (View.Невидимый); не работает

Я хочу, чтобы мои DatePicker и кнопку чтобы быть невидимым в начале. И когда я нажимаю свою волшебную кнопку, Я хочу setVisibility(View.Видимый);

проблема здесь в том, когда я 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());
    }
});

7 ответов


Я вижу довольно много вещей неправильно. Для начала, у вас нет определенной волшебной кнопки, и для нее нет обработчика событий.

также вы не должны использовать:

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

использовать только один из двух. От документация для Android:

вид.Исчез этот вид невидим, и он не занимает никакого места для цели компоновки.

вид.Невидимый этот взгляд невидим, но он все еще занимает место для макета цели.

в вашем примере вы переопределяете 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);
}

вы можете думать, что это видимость и отображение стиля 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);

здесь вы устанавливаете обе видимости в одно и то же поле, так что это проблема. Я даю один образец для этого демо


вид.Ушел этот вид невидим, и он не занимает никакого места для целей макета.

вид.Невидимый этот вид невидим, но он по-прежнему занимает место для целей макета.

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, но прямо на следующем кадре он волшебным образом становится VISIBLE. Я пытался понять, как это могло случиться.

оказывается, к этому представлению была применена анимация, которая внутренне заставила представление изменить его видимость на VISIBLE до окончания анимации:

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

    myViewGroup.setVisibility(View.GONE);
}

если вы отлаживаете, вы увидите, что myViewGroup действительно меняет видимость на GONE, но прямо на следующем кадре он снова станет видимым, чтобы запустить анимацию.

Итак, если вы столкнетесь с такой ситуацией, убедитесь, что вы не выполняете if Регистрация в разгар оживления вида.

вы можете удалить все анимации на вид через вид.clearAnimation().


вид.GONE делает вид невидимым без представления, занимающего место в макете. Вид.Невидимый делает вид просто невидимым, все еще занимая пространство.

вы сначала используете GONE, а затем невидимый на том же представлении.Поскольку код выполняется последовательно, сначала представление исчезает, затем оно переопределяется невидимым типом, все еще занимающим пространство.

вы должны добавить прослушиватель кнопок на кнопке и внутри метода 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);

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

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

Я думаю, что это должно легко работать. Надеюсь, это поможет.


потому что вы устанавливаете видимость true или false. попробовать это setVisible(0) для видимого true . and setVisible(4) для видимого false.