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());
}
});
Ответы
Ответ 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.