wake-up-neo.com

Android: warum setVisibility (View.GONE); oder setVisibility (View.INVISIBLE); arbeite nicht

Ich möchte, dass meine DatePicker und der Button am Anfang unsichtbar sind. Und wenn ich meinen Zauberknopf drücke, möchte ich Sichtbarkeit (Sicht.Visible) einstellen;

Das Problem hier ist, wenn ich setVisibility(View.GONE) oder setVisibility(View.INVISIBLE) nichts ändert und die Komponente immer noch sichtbar ist.

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());
    }
});
47
nayden

Ich sehe viele Dinge falsch. Für den Anfang haben Sie keinen Zauberknopf definiert und es gibt keinen Event-Handler dafür.

Sie sollten auch nicht verwenden:

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

Verwenden Sie nur eine der beiden. Von Android Dokumentation :

View.GONE Diese Ansicht ist unsichtbar und nimmt keinen Platz für Layoutzwecke. 

View.INVISIBLE Diese Ansicht ist unsichtbar, aber immer noch nimmt Platz für Layoutzwecke.

In Ihrem Beispiel überschreiben Sie die View.GONE-Zuweisung mit der View.INVISIBLE-Zuordnung.


Versuchen Sie es zu ersetzen:

final DatePicker dp2 = new DatePicker(this)

mit:

DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);  

Ähnlich für andere Widgets:

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

Sie können es als CSS-Sichtbarkeit und Anzeige betrachten.

<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>
8
az3

Zuerst sehen Sie Ihren Code: 

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

Hier stellen Sie beide Sichtbarkeit auf dasselbe Feld ein, also ist dies das Problem ... Ich gebe ein Beispiel für diese Beispieldemo

6
Parag Chauhan

Heute hatte ich ein Szenario, in dem ich folgende Aktion durchführte:

myViewGroup.setVisibility(View.GONE);

Gleich im nächsten Frame führte ich eine if-Prüfung an einem anderen Ort durch, um den Sichtbarkeitsstatus dieser Ansicht zu überprüfen. Und rate was? Die folgende Bedingung war bestanden:

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

Wenn Sie Haltepunkte setzen, sehen Sie, dass die Sichtbarkeit in GONE geändert wird, aber gleich beim nächsten Bild wird es magisch VISIBLE. Ich versuchte zu verstehen, wie zur Hölle das passieren konnte. 

Es stellte sich heraus, dass auf diese Ansicht eine Animation angewendet wurde, die intern dazu führte, dass die Sicht in VISIBLE geändert wurde, bis die Animation beendet wurde:

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

    myViewGroup.setVisibility(View.GONE);
}

Beim Debuggen sehen Sie, dass myViewGroup tatsächlich seine Sichtbarkeit in GONE ändert, aber gleich beim nächsten Bild würde es wieder sichtbar, damit die Animation ausgeführt werden kann.

Wenn Sie also auf eine solche Situation stoßen, stellen Sie sicher, dass Sie keine if-Überprüfung durchführen, während Sie die Ansicht animieren.

Sie können alle Animationen in der Ansicht über View.clearAnimation () entfernen.

3
azizbekian

View.GONE Diese Ansicht ist unsichtbar und nimmt für Layoutzwecke keinen Platz ein.

View.INVISIBLE Diese Ansicht ist unsichtbar, nimmt aber für Layoutzwecke noch Platz in Anspruch.

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
1
Pankaj Talaviya

View.GONE macht die Ansicht unsichtbar, ohne dass die Ansicht Platz im Layout einnimmt. Durch View.INVISIBLE ist die Ansicht nur unsichtbar und nimmt noch Platz ein.

Sie verwenden zuerst GONE und dann INVISIBLE in derselben Ansicht. Da der Code sequentiell ausgeführt wird, wird die Ansicht zuerst GONE und dann durch den Typ INVISIBLE überschrieben, der immer noch Platz beansprucht. 

Sie sollten einen Schaltflächenlistener auf der Schaltfläche hinzufügen und die Ansichten innerhalb der onClick () -Methode sichtbar machen. Dies sollte die Logik in Ihrer onCreate () -Methode sein.

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

Ich denke, das sollte problemlos funktionieren. Hoffe das hilft.

0
Trishant Sharma

In meinem Fall habe ich festgestellt, dass das einfache Löschen der Animation in der Ansicht vor dem Festlegen der Sichtbarkeit auf GONE funktioniert.

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

Ich hatte ein ähnliches Problem, bei dem ich zwischen zwei Ansichten umgeschaltet habe, von denen eine immer als GONE beginnen muss. Wenn ich die Ansichten jedoch erneut anzeigte, wurde sie über der ersten Ansicht angezeigt, auch wenn setVisibility(GONE) hieß. Das Löschen der Animation vor dem Setzen der Ansicht auf GONE hat funktioniert.

0
Pierre