Εδώ'είναι ο κώδικας διάταξης μου,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TextView>
<LinearLayout android:id="@+id/LinearLayout"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom">
<EditText android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</EditText>
<Button android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
</LinearLayout>
Αυτό που μοιάζει είναι στα αριστερά και αυτό που θέλω να μοιάζει είναι στα δεξιά.
Η προφανής απάντηση είναι να ορίσουμε το TextView σε fill_parent on height, αλλά αυτό προκαλεί ότι δεν αφήνεται χώρος για το κουμπί ή το πεδίο εισαγωγής.
Ουσιαστικά το θέμα είναι ότι θέλω το κουμπί υποβολής και η καταχώρηση κειμένου να έχουν σταθερό ύψος στο κάτω μέρος και η προβολή κειμένου να γεμίζει τον υπόλοιπο χώρο. Ομοίως, στην οριζόντια γραμμική διάταξη θέλω το κουμπί υποβολής να τυλίγει το περιεχόμενό του και η καταχώρηση κειμένου να γεμίζει τον υπόλοιπο χώρο.
Αν το πρώτο στοιχείο σε μια γραμμική διάταξη έχει την εντολή fill_parent, κάνει ακριβώς αυτό, χωρίς να αφήνει χώρο για άλλα στοιχεία. Πώς μπορώ να κάνω ένα στοιχείο που είναι το πρώτο σε μια γραμμική διάταξη να γεμίζει όλο το χώρο εκτός από το ελάχιστο που απαιτείται από τα υπόλοιπα στοιχεία της διάταξης;
<hr/>,
Οι σχετικές διατάξεις ήταν πράγματι η απάντηση:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true">
</TextView>
<RelativeLayout
android:id="@+id/InnerRelativeLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<Button
android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
<EditText
android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_toLeftOf="@id/Button"
android:layout_height="wrap_content">
</EditText>
</RelativeLayout>
</RelativeLayout>
Ο σύγχρονος τρόπος για να το κάνετε αυτό είναι να έχετε ένα ConstraintLayout και να περιορίσετε το κάτω μέρος της προβολής στο κάτω μέρος του ConstraintLayout με app:layout_constraintBottom_toBottomOf="parent"
Το παρακάτω παράδειγμα δημιουργεί ένα FloatingActionButton που θα ευθυγραμμιστεί στο τέλος και στο κάτω μέρος της οθόνης.
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent">
<android.support.design.widget.FloatingActionButton
android:layout_height="wrap_content"
android:layout_width="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</android.support.constraint.ConstraintLayout>
Για λόγους αναφοράς, θα κρατήσω την παλιά μου απάντηση.
Πριν από την εισαγωγή του ConstraintLayout η απάντηση ήταν relative layout.
Εάν έχετε μια σχετική διάταξη που γεμίζει ολόκληρη την οθόνη, θα πρέπει να μπορείτε να χρησιμοποιήσετε το android:layout_alignParentBottom
για να μετακινήσετε το κουμπί στο κάτω μέρος της οθόνης.
Αν οι προβολές σας στο κάτω μέρος δεν εμφανίζονται σε σχετική διάταξη τότε ίσως η διάταξη πάνω από αυτό καταλαμβάνει όλο το χώρο. Σε αυτή την περίπτωση μπορείτε να τοποθετήσετε την προβολή, που πρέπει να βρίσκεται στο κάτω μέρος, πρώτη στο αρχείο διάταξης και να τοποθετήσετε την υπόλοιπη διάταξη πάνω από τις προβολές με το android:layout_above
. Αυτό επιτρέπει στην κάτω προβολή να καταλαμβάνει όσο χώρο χρειάζεται και η υπόλοιπη διάταξη μπορεί να γεμίσει όλη την υπόλοιπη οθόνη.
Σε ένα ScrollView
αυτό δεν λειτουργεί, καθώς το RelativeLayout
θα επικαλύπτει οτιδήποτε βρίσκεται στο ScrollView
στο κάτω μέρος της σελίδας.
Το διόρθωσα χρησιμοποιώντας ένα δυναμικά τεντωμένο FrameLayout
:
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:fillViewport="true">
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical">
<!-- content goes here -->
<!-- stretching frame layout, using layout_weight -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</FrameLayout>
<!-- content fixated to the bottom of the screen -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- your bottom content -->
</LinearLayout>
</LinearLayout>
</ScrollView>
Δεν χρειάζεται καν να φωλιάσετε τη δεύτερη "σχετική" διάταξη μέσα στην πρώτη. Απλά χρησιμοποιήστε το android:layout_alignParentBottom="true"
στο Button και στο EditText.