Frage

Ich will meine DatePicker und der Knopf, der beim Beginn unsichtbar ist. Und wenn ich meine magische Taste drücke, möchte ich die Setvissibilität (View.vissible);

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

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());
    }
});
War es hilfreich?

Lösung

Ich sehe einige Dinge falsch. Für den Anfang haben Sie Ihren magischen Knopf nicht 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 einen der beiden. Aus Android -Dokumentation:

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

View.invisible Diese Ansicht ist unsichtbar, nimmt aber dennoch Platz für Layoutzwecke ein.

In Ihrem Beispiel überschreiben Sie die View.GONE Aufgabe mit dem View.INVISIBLE eines.


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

Andere Tipps

Sie können es als Sichtbarkeit und Anzeige im CSS -Stil denken.

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

Sehen Sie zuerst Ihren Code:

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

Hier setzen Sie beide Sichtbarkeit auf das gleiche Feld, das ist das Problem. Ich gebe ein Beispiel dafür Probe Demo

Heute hatte ich ein Szenario, in dem ich folgende Aktionen auftrat:

myViewGroup.setVisibility(View.GONE);

Direkt am nächsten Frame habe ich eine durchgeführt if Überprüfen Sie an einem anderen Ort, um den Stand der Sichtbarkeit dieser Ansicht zu erhalten. Und rate was? Die folgende Bedingung war vorbei:

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

Platzieren Sie die Haltepunkte, die Sie sehen, diese Sichtbarkeit ändert sich an GONE, aber richtig im nächsten Rahmen wird es auf magische Weise VISIBLE. Ich versuchte zu verstehen, wie zum Teufel das passieren könnte.

Es stellt sich heraus VISIBLE bis die Animation beendet wird:

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

    myViewGroup.setVisibility(View.GONE);
}

Wenn Sie debuggen, werden Sie das sehen myViewGroup ändert in der Tat seine Sichtbarkeit an GONE, Aber genau im nächsten Frame würde es wieder sichtbar werden, um die Animation auszuführen.

Wenn Sie also auf eine solche Situation stoßen, stellen Sie sicher, dass Sie keine durchführen if Überprüfen Sie, wie Sie die Ansicht animieren.

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

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

View.invisible Diese Ansicht ist unsichtbar, nimmt aber dennoch Platz für Layoutzwecke ein.

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

View.gone macht die Ansicht unsichtbar, ohne dass die Ansicht im Layout Platz einnimmt. View.invisible lässt die Ansicht nur unsichtbar immer noch Platz einnehmen.

Sie verwenden zuerst Gone und dann in derselben Ansicht unsichtbar. Seit dem Code wird der Code nacheinander ausgeführt. Zuerst wird die Ansicht verschwunden, dann wird er von dem unsichtbaren Typ überschrieben, der noch Platz einnimmt.

Sie sollten die Schaltfläche Listener auf der Schaltfläche und in der Onclick () -Methode hinzufügen, die die Ansichten sichtbar machen. Dies sollte mir die Logik in Ihrer OnCreate () -Methode ansässig 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 leicht funktionieren. Hoffe das hilft.

In meinem Fall stellte ich fest, dass einfach die Animation in der Ansicht gelöscht wird, bevor die Sichtbarkeit aufgestellt wurde GONE Arbeiten.

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

Ich hatte ein ähnliches Problem, bei dem ich zwischen zwei Ansichten umschaltete, von denen eines immer als beginnen muss GONE - Aber als ich die Ansichten erneut anzeigte, wurde es über die erste Ansicht angezeigt, auch wenn setVisibility(GONE) hieß. Löschen der Animation, bevor Sie die Ansicht festlegen GONE hat funktioniert.

Setvisibilität funktioniert auch nicht für mich

fabCamera.setVisibility(View.GONE);

Dieser Fehler ist:

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

Ich bin in Androidx und versuchte zu importieren com.google.android.material aber es hat nicht funktioniert

Weil Sie die Sichtbarkeit entweder wahr oder falsch festlegen. Versuch dassetVisible(0) zu sichtbar wahr.and setVisible(4) zu sichtbares falsch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top