getTop liefert falschen Wert, wenn ich vom Intent zurückkehre

  • Hallo,


    ich hab ein Linearlayout, dessen Position ich benötige. Diese rufe ich mit:


    Code
    linearlayouts.get(i).getTop()


    in einem Fragment auf.


    Wenn ich die App starte, ist die Position in Ordnung. Sie zeigt 573 an.


    Nun rufe ich ein Intent auf:



    Code
    final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent i = new Intent(MainActivity.this, NewDate.class);
                    startActivityForResult(i, 1);
                }
            });


    Kehre ich vom Intent zurück, liefert linearlayouts.get(i).getTop() einen falschen Wert, nämlich 264.



    Warum ist das so?



    Es scheint, als ob die obere Toolbar nicht mehr dazugerechnet wird...

  • Hallo,


    wie man in den Screenshots sieht, ist der erste Screenshot korrekt.


    Dann füge ich einen neuen Termin ein (zweiter Screenshot).


    Mit diesem Code wird der Viewpager benachrichtigt, dass er sich aktualisieren soll.



    Es kommt aber nur Schrott raus (Screenshot 3). Die Termine sollen alle um 16 Uhr da sein, sind es aber nicht.


    Ich tippe darauf, dass die LinearLayouts, die die Uhrzeiten anzeigen, am Anfang nicht der Größe des Bildschirms entsprechen und es somit falsche Werte liefert.


    Aber wie kann ich dieses Problem umgehen?

  • das sieht so aus als die Termine nicht richtig eingetragen werden. Wenn du den Standard Kalender öffnest u d dort die Termine nachschaust stimmen sie. Oder sind sie da auch falsch.

    Hallo jogimuc,


    nein, dort sind sie richtig.


    Beim Starten meiner App sind die Termine auch richtig eingetragen. Nur wenn ich vom Intent zurückkehre, werden sie falsch dargestellt. Ich rufe dann notifyDataSetChanged() auf, um das Fragment zu aktualsieren.


    Die Termine werden dann mit setMargin() von oben und von links am Bildschirm verschoben.


    Code
    layout.setMargins(x, y, 0, 0);

    Das funktioniert beim Starten meiner App. Aber warum nicht, wenn ich einen neuen Termin eintrage und dann notifyDataSetChanged() aufrufe:



    Was mir aufgefallen ist: Wenn ich vom Intent zurückkehre, sind alle Stundenanzeigen zuerst geschrumpft, erst nach einigen Millisekunden weiten sie sich aus.

  • was rufst du denn mit dem intent auf? Wenn du mit fragments arbeitest brauchst du doch eigentlich keinen intent um das Fragment zu tauschen.

    Hallo,


    mit dem Intent rufe ich eine neue Activity auf (siehe Screenshot 2), in der man einen neuen Termin hinzufügen kann.


    Mit Klick auf den Hacken obenrechts wird dieser Codeabschnitt aufgerufen:


    Code
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch(requestCode) {
                case 1:
                    System.out.println("Date added");
                    doubleViewPager.getVerticalViewPager().getAdapter().notifyDataSetChanged();
                    break;
            }
        }

    Somit wird der Viewpager aktualisiert mit dem neuen Termin.


    Die Termine sind allerdings falsch angeordnet.

  • Das tue ich bereits.


    Ich glaube, das Problem ist einfach, dass während sich die Stundenanzeige aufbaut, sie noch nicht den ganzen Bildschirm füllt.


    Es muss unter Android bestimmt eine Funktion/einen Listener geben, der darauf wartet, bis sich die Anzeige vollständig aufbaut. Erst dann kann ich meine Termine hinzufügen.

  • Kann sein. Nur wenn du Termine in den Kalender einfügst wieso muss da ein layout geladen werden. Dachte immer man wurde die Termine über einen Content proweider der Kalender app hinzufügen. Wie das genau geht kann ich dort leider nicht genau sagen.

  • Nur wenn du Termine in den Kalender einfügst wieso muss da ein layout geladen werden.

    Nun ja, die Stundenanzeige wie im Screenshot (von 7:00 Uhr bis 21:00 Uhr) muss zuerst erstellt werden. Erst DANACH werden die Termine eingetragen.


    Ich brauche ja die Position von zum Beispiel sagen wir mal 12:00 Uhr, wenn ein Termin hinzugefügt werden muss.


    Diese Position hole ich mit:


    Code
    linearlayouts.get(i).getTop()


    Edit: Es funktioniert nicht.

  • Ich glaube, jetzt habe ich die endliche Lösung.


    Das Problem war, dass das Soft Keyboard im Weg war.


    Vor finish() die folgende Funktion aufrufen und es gibt keine Probleme mehr:

    Code
    public static void hideSoftKeyboard(Activity activity) {
            final InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
            if (inputMethodManager.isActive()) {
                if (activity.getCurrentFocus() != null) {
                    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
                }
            }
        }

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!