Подтвердить что ты не робот

Android: почему setVisibility (View.GONE); или setVisibility (View.INVISIBLE); не работает

Я хочу, чтобы мой DatePicker и кнопка были невидимы в начале. И когда я нажимаю свою волшебную кнопку, я хочу установитьVisibility (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());
    }
});
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

Сначала посмотрите код:

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

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

Ответ 4

Сегодня у меня был сценарий, где я выполнял следующее действие:

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 в разгар анимации вида.

Вы можете удалить все анимации в представлении с помощью View.clearAnimation().

Ответ 5

View.GONE Это представление невидимо, и оно не занимает места для целей макета.

View.INVISIBLE Это представление невидимо, но оно все еще занимает место для целей макета.

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

Ответ 6

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

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

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

Ответ 7

В моем случае я обнаружил, что простая очистка анимации в представлении перед установкой видимости на GONE работает.

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

У меня была похожая проблема, когда я переключался между двумя видами, один из которых всегда должен начинаться с GONE - Но когда я снова отображал виды, он отображался поверх первого вида, даже если вызывался setVisibility(GONE). Очистка анимации перед установкой вида на GONE сработала.

Ответ 8

setVisibility у меня тоже не работает

fabCamera.setVisibility(View.GONE);

эта ошибка:

VisibilityAwareImageButton.setVisibility can only be called from within the same library group (groupId=com.google.android.material)

Я нахожусь в androidx и пытался импортировать com.google.android.material, но это не сработало

Ответ 9

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