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.