Layout-Problem

  • Hallo,
    ich hab schon wieder ein ziemlich nerviges Problem und kann es einfach nicht lösen, obwohl es sich einfach anhört.


    Ich habe ein Layout mit (vorläufig) einem EditText-Feld und einem "Cancel"-Button.


    Ich möchte folgendes erreichen:


    1. Das Textfeld soll später unterschiedlich lange Texte ( von etwa 1 ... 10 Zeilen ) aufnehmen und muss daher mit dem Inhalt von oben in der Höhe "wachsen".
    Also die erste Zeile des Textinhalts soll immer ganz oben auf dem Display sein, und es soll bei sehr viel Text nicht mehr als 90% der Displayhöhe beanspruchen.


    2. In den unteren 10% des Displays möchte ich eine Zeile mit mehreren Buttons ( momentan zum Testen aber nur einer ) darstellen.


    Mein Problem: Egal, welchen Layout-Container ich verwende, irgendwas geht immer nicht.


    Beispiel :
    Bei einem Relative Layout funktionieren keine Margins. ( Ihr könnt's mir glauben, es sollte gehen, es geht aber nicht !) Somit kann ich unterschiedlich hohe Buttons, Switches, Checkboxen u.s.w. nicht in einer Höhe darstellen.


    Bei einem Constraint-Layout ( XML habe ich unten angegeben ) funktionieren keine Constraints, die an den unteren Containerrand gekoppelt werden. Das Ergebnis: Der Button steht mitten im Edittext, statt am unteren Displayrand.


    Hat jemand eine Idee, wie man sowas möglichst einfach hinbekommt?
    Das kann doch eigentlich nicht so schwer sein, aber ich knacke jetzt schon 4 Tage daran rum.



  • Hallo



    Dann setze deine Anfasser (Constraints ) richtig.
    Beim Text hast du den Linken am Rand , den Rechten auch am Rand, Den Oberen auch oben am Rand. Soweit Richtig.


    Bei deinem Button hast du nur zwei
    Den rechten am rechten Rand, den unteren am unteren Rand.


    Setze alle, also auch den linken an den linken Rand .
    Wichtig den oberen an den Text.



    app:layout_constraintTop_toTopOf="@+id/editText_TaskShow"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"

  • Danke für die schnelle Antwort, aber das habe ich alles schon probiert.
    Ich habe den Button zum Beispiel in alle 4 Richtungen an den Rand des Constraint-Layouts verbunden.


    Im Editor erscheint der Button dann zentriert in der Mitte des Displays, aber im Emulator oder auf dem Gerät erscheint er ganz oben und überdeckt meinen Text.
    Wenn ich ihn mit der Maus nach unten ziehe, verändert sich ein Parameter layoutConstraint_Vertical_Bias ( ich denke 0 bedeutet oben, 1 bedeutet unten )
    Im Editor verschiebt er sich auch nach unten, aber im Emulator oder auf dem Gerät ist er wieder ganz oben..
    Das einzige, was hilft ist, den Parameter Margin zu erhöhen.


    Die gleiche Reaktion passiert auch, wenn ich den Button nicht an den oberen Layout-Rand binde, sondern an den unteren Rand des Edit-Feldes.


    Ich verstehe auch nicht, warum ich alle 4 Richtungen angeben muss.
    Es sollte doch eigentlich reichen, den Abstand rechts und unten festzulegen.

  • Neue Erkenntnisse:
    Ich habe mal ein komplett neues Projekt aufgesetzt.
    Im Layout nur ein Textfeld und ein Button.
    Constraints beim Button nur nach unten und rechts, und der Button erscheint unten.


    Nur in meinem ursprünglichen Projekt geht es nicht.


    Der Unterschied:
    Die neue funktionierende App hat bei der Erzeugung das Layout.xml selbst automatisch erstellt.


    Da die App, bei der es nicht funktioniert, mehrere Layouts hat, habe ich diese über das Menü File , New, XML, LayoutXML file erstellt.
    Und mit den so erstellten XML-Files geht es nicht.


    Mir ist erst jetzt aufgefallen, dass in den beiden Files die Definition des Constraint Layouts unterschiedlich ist.


    Im funktionierenden XML-File steht:


    <androidx.constraintlayout.widget.ConstraintLayoutIm XML-File, das über das Menü erzeugt wird steht:<android.support.constraint.ConstraintLayout

  • OK jetzt arbeitest du mit androidx.


    Auch in dem anderen thread habe ich dich am Anfang gefragt für oder unter welcher Android Version du arbeitest. Das war für dich wider mal unwichtig unrelewant wie du behauptest.


    Wie sieht den dein gradle file vom alten Projekt aus.

  • Ich beantworte sinnlose Fragen grundsätzlich nicht.
    Ich habe geschrieben, das der Fehler bei verschiedenen Handys mit verschiedenen Android Versionen auftritt, und daher nehme ich an, es hat nichts mit der Android-Version zu tun.
    Und wenn es so wäre: Es wäre längst bekannt geworden, wenn Android X.Y keine Buttons am unteren Displayrand darstellen kann.


    Es muss also etwas sein, was ich mache, aber üblicherweise so nicht gemacht wird.
    Und da denke ich an meine vielen Displays.
    Und dabei ist mir eben aufgefallen, das ein und dieselbe Studio-Version zwei verschiedene Arten von Constraint-Layouts erzeugt.
    Einmal mit Android: und mit AndroidX:
    Also bin nicht ich es, der jetzt plötzlich mit AndroidX arbeitet, sondern das Studio macht das gezwungenermaßen so.
    Ich weiss noch nicht mal, worum es da eigentlich geht.

  • Also dein Gradle File wäre schon wichtig gewesen.


    Um zu sehen wie dein Projekt aufgebaut ist, um zu sehen mit welchen libs du arbeitest .


    Es macht schon eine unterschied ob du mit den alten Support libs oder mit den neuen Abdroidx arbeitest.


    Richtig bei beiden brauchst du eigentlich nur zwei Anfasser für eine View.


    Wie du siehst geht es bei deinen alten Beispiel nicht.


    Da benutzt du noch Support Libszu mindestens im Layout. Ob du das auch im Projekt richtig machst wissen wir nicht. ob du da auch die richtigen Libs lädst. Denn da gibst es Abhängigkeiten.


    Was bei Androidx nicht mehr so zwingend ist.


    Wahrscheinlich hast du das Projekt angefangen als es noch nicht üblich war mit Androidx zu arbeiten.


    Deshalb die Frage nach dem Gradle File. Gradle Version …



    Zitat

    Es muss also etwas sein, was ich mache, aber üblicherweise so nicht gemacht wird.
    Und da denke ich an meine vielen Displays.

    Ich denke da an eine fehlende oder falsche Support Lib.
    Deshalb Gradle File



    Zitat

    Ich beantworte sinnlose Fragen grundsätzlich nicht.

    Ok wenn du nicht willst bitte sehr deine Sache.


    Zitat

    Und dabei ist mir eben aufgefallen, das ein und dieselbe Studio-Version zwei verschiedene Arten von Constraint-Layouts erzeugt.
    Einmal mit Android: und mit AndroidX:

    Das ist bei allen so. Ab irgendeiner AS Version ist das Standard und bei einen neuen Projekt wird das standardmäßig von AS so gemacht. Mit vielen oder wenig Views hat das nichts zu tun.
    Soviel zu sinnlosen Aussagen.


    Zitat

    Also bin nicht ich es, der jetzt plötzlich mit AndroidX arbeitet, sondern das Studio macht das gezwungenermaßen so.

    Sagte ich bereits neuer Standart.




    Zitat

    Ich weiss noch nicht mal, worum es da eigentlich geht.

    dann wird es wohl zeit sich mit den Support Libarys und dem Androidx zu beschäftigen.
    https://developer.android.com/…libraries/support-library
    https://developer.android.com/jetpack/androidx


    dies werden wohl meine letzten sinnlosen antworten hierzu gewesen sein.
    wünsche dir viel Glück.

  • Ich denke da an eine fehlende oder falsche Support Lib.
    Deshalb Gradle File

    Ok, also hätte deine Frage lauten müssen:
    Sende bitte mal den Inhalt deines Gradle-Files, damit ich sehen kann, welche Libs du benutzt.
    Diese Frage wäre nicht irrelevant, sondern sehr treffend gewesen.


    Obwohl ich auch da nicht verstehe, warum das gleiche und gleich konfigurierte Studio bei "Project new" eine andere Lib-Version verwenden sollte als bei "new. xml layout"


    Du hast aber nach der Android Version gefragt, die ich einsetze bzw für die ich entwickle.


    Und da du jetzt antwortest: "Es ist normal, das das Studio zwei verschiedene Constraint-Layouts erzeugt"


    Bedeutet das: "Auch ohne nach der Android-Version zu fragen, hätte ich dir sagen können, das ist normal beim Studio."


    Denn sonst hätte deine Antwort so lauten müssen:
    Android Studio verwendet zwei Layouts, wenn die Android-Version kleiner als x ist.


    Aber drehen wir's doch mal um:
    Die Antwort habe ich dir jetzt verspätet gegeben. Welche Schlüsse ziehst du jetzt aus meiner Android-Version?
    Denn wenn die Android-Version relevant wäre, dann müsste es jetzt eine Antwort geben, in der auf die Version Bezug genommen wird.
    Etwa so:
    Jaaaa, bei Version XY gibts ein Problem.


    Wenn es eine solche Antwort nicht gibt, dann ist die Frage nach der Version irrelevant.


    Ich mache auch nichts besonderes. Ich habe die Standard-Einstellungen vom Studio verwendet und weiß nicht mal, wie und auf welche Libraries man umstellen kann.
    Ich weiß nur, das ich einige Sachen mache, die ungewöhnlich sind.
    Dazu gehört zu Beispiel, das ich viele Layout.xml's habe, die per Include in eine main_layout.xml eingebunden werden.


    Es braucht sich aber jetzt keiner noch eine große Mühe machen, ich habe alle Container auf Grid-Layouts umgestellt, und damit kann ich alles so positionieren, wie ich will.



    Ach ja, hier noch die "hoffentlich relevanten" ( grins ) Stellen aus Meinen Gradle-Files:
    Wie man sieht, war die Frage danach sehr wohl relevant, denn wie du richtig vermutet hast, stehen da unterschiedliche Libs für Constraints.


    NUR: Ich habe da nichts gemacht. Ich habe das fehlerhafte Projekt vor einigen Monaten erstellt und das, was jetzt AndroidX verwendet vorgestern.
    Ich wüsste nicht,das ich da irgendwo "rumgeschraubt" habe.


    Aus build.gradle (Prject):
    classpath 'com.android.tools.build:gradle:3.5.2'und aus der build.gradle (Modules): dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:gridlayout-v7:28.0.0'
    }


    UNd wenn ich ein neues Projekt anlege, dann steht in build.gradle (Modules):


    dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

  • Wann Google das geändert hat das bei einem neuen Projekt automatisch das androidx benutzt wird kann ich nicht sagen. Ist schon länger so.


    Mich hatte erstmal interessiert was du nutzt support lib oder Androidx.


    Offt wird beides genutzt was zu solchen Problemen führen kann.
    Das ist bei dir scheinbar nicht der Fall.


    Interessant wäre auch die
    compileSdkVersion
    targetsdkversion
    minsdkverion
    gewesen.


    Weil auch bei sehr niedrigen minsdk solche Probleme auftreten.


    Wenn es sich mit so nicht beheben lässt. Ist meistens das komplette Projekt gestört. Oder auch irgend eine andere Layout Dadei.
    Da hilft meistens nur neu machen.


    In deinem Fall würde ich aber sagen das es an deiner Layout Struktur gliegt.
    Bestimmt etwas wirrwar bei deinen includes.


    Um da eine sinnvolle Aussage machen zu können. Wären die übergeordneten Layouts auch sinnvoll gewesen. Also das Layout wo der include ist.



    OK alles gut. Und gutes gelingen.

Jetzt mitmachen!

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