1

Ich habe folgende ConstraintLayout in meinem Android-Anwendung:Knopf überlappende EditText wenn Tastatur geöffnet ist

<android.support.constraint.ConstraintLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/white"> 

     <ImageView 
      android:id="@+id/image_icon" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/icon" 
      app:layout_constraintTop_toTopOf="parent" 
      app:layout_constraintEnd_toEndOf="parent" 
      app:layout_constraintStart_toStartOf="parent" 
      /> 

     <TextView 
      android:id="@+id/instructions" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="@dimen/spacing_large" 
      android:text="@string/instruction" 
      app:layout_constraintTop_toBottomOf="@id/support_ic" 
      app:layout_constraintEnd_toEndOf="parent" 
      app:layout_constraintStart_toStartOf="parent" 
      /> 

     <Button 
     android:id="@+id/call_button" 
     android:layout_marginTop="@dimen/spacing_large" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:text="@string/phone" 
     android:textSize="18sp" 
     android:textColor="@drawable/button" 
     app:layout_constraintTop_toBottomOf="@+id/instructions" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     /> 


     <EditText 
      android:id="@+id/message_content" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:lines="8" 
      android:hint="@string/support_message_hint" 
      android:textColorHint="@color/text_hint" 
      android:inputType="textCapSentences|textMultiLine" 
      android:background="@color/background_gray" 
      android:padding="@dimen/spacing_small" 
      android:textColor="@color/black" 
      app:layout_constraintBottom_toTopOf="@+id/send_button" 
      app:layout_constraintStart_toStartOf="parent" 
      app:layout_constraintEnd_toEndOf="parent" 
      android:gravity="top|left" 
      app:layout_constraintHorizontal_weight="1" 
      app:layout_constraintVertical_weight="1" 
      /> 

     <Button 
      android:id="@+id/send_button" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:text="@string/support_send" 
      android:background="@color/button_blue" 
      app:layout_constraintBottom_toBottomOf="parent" 
      app:layout_constraintStart_toStartOf="parent" 
      app:layout_constraintEnd_toEndOf="parent" /> 

    </android.support.constraint.ConstraintLayout> 

Wenn ich die Tastatur öffnen, die Ansicht passt und die unteren zwei Widgets (die Taste und die editText) bewegen sich mit die Tastatur. Mein Problem ist jedoch, dass die @ id/call_button-Schaltfläche in diesem Fall oben auf dem editText liegt. Ich will das nicht. Ich möchte, dass der editText die Schaltfläche überlagert, wenn die Tastatur geöffnet ist.

Gibt es eine Möglichkeit, den editText Präzedenzfall zu machen, wenn andere Widgets in diesem Szenario überlappen? Ich habe versucht, editText.bringToFront() in meiner OnCreate-Methode hinzuzufügen, aber das hat nichts getan.

Außerdem versuche ich zu vermeiden, die unteren zwei Widgets (die Schaltfläche und den editText) innerhalb ihres eigenen Layouts verschachteln. Ich möchte, dass sie alle im selben ConstraintLayout bleiben. Danke für die Hilfe im Voraus.

keyboard open image

keyboard closed image

+0

Können Sie einen Screenshot des Problems hinzufügen? – MidasLefko

+0

Ja, gib mir einfach eine Sekunde – hermt2

+0

okay, ich habe sie hinzugefügt – hermt2

Antwort

1

Ich habe android:elevation="4dp" in die XML des editText und es funktionierte.

+0

Sie können den Code neu anordnen, um den Code des editText-Abschnitts unter den Button-Code zu setzen, ich denke, dass es besser sein wird als die Elevation, weil die Höhe in android <21 nicht unterstützt wird und Sie haben Auswirkungen auf den Z-Zugriff der Komponente, was in Zukunft zu einem weiteren Problem führen kann, falls Sie Änderungen an der Konstruktion vornehmen. Darüber hinaus reicht es, die Höhe 1dp einzustellen. –

+0

Nein Ich habe versucht, den Code bereits neu zu ordnen und es hat nicht funktioniert. Auch habe ich keine Warnungen dafür in der Xml, und ich getestet auf einem Api 19 Gerät und es hat funktioniert (Konnte etwas mit ConstraintLayout zu tun?) – hermt2

0

Material Design Richtlinien geben an, dass Button s Elevation sowohl in ihrer gedrückten (8dp Höhe) als auch in der (2dp Höhe) Zustände verwenden. https://material.io/guidelines/material-design/elevation-shadows.html#elevation-shadows-elevation-android

Die Sie sehen, wenn zwei auf der jeweils anderen auf gleicher Höhe gestapelt sind ist abhängig von der Bestellung dieser Ansichten in Ihrem Layout (zB warum erwartet man die schriftlichen Ansichten später die Ansichten zu überlagern geschrieben früher), aber die Erhebung hat Vorrang vor diesem.

Wie Sie herausgefunden haben, können Sie Ihren anderen Ansichten Höhen hinzufügen, um sie "höher" als Ihre Schaltfläche zu machen, aber das ist ein bisschen hässlich und könnte einige unerwünschte Nebenwirkungen haben. Ich denke, eine bessere Wahl wäre, das Manifest-Attribut android:windowSoftInputMode="adjustPan" auf Ihre Aktivität zu setzen. Dadurch wird die Ansicht Ihrer Aktivität beim Öffnen der Tastatur verschoben, anstatt die Größe zu ändern.

+0

Eine andere Option könnte einfach 'TextView' anstelle von' Button' zu verwenden für diese eine Komponente. –

Verwandte Themen