it-swarm-id.com

Tata letak relatif Android dengan lebar tombol menggunakan bobot

Saya telah menggunakan parameter layout_weight untuk mengatur lebar tombol pada 70% dari total lebar tata letak, tapi sepertinya saya kehilangan beberapa detail penting untuk membuatnya bekerja.

(Solusi lain adalah bekerja dengan display.getWidth() secara terprogram, tetapi tidak bekerja juga, karena saya tidak tahu seperti apa .xml saya akan terlihat seperti Jika saya memilih untuk mengatur lebar dengan button.setWidth()

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_height="fill_parent" 
    Android:layout_width="fill_parent"
    Android:layout_weight="1.0">
    <TextView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textSize="15px"  
        Android:id="@+id/userVersionTextViewNew"
        Android:gravity="center"
        Android:layout_centerVertical="true"/>
    <TextView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textSize="15px"
        Android:gravity="center"
        Android:layout_above="@id/userVersionTextViewNew"
        Android:id="@+id/userSoftSerialNumberTextView"/>
    <ImageView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:src="@drawable/logo_200"
        Android:layout_above="@id/userSoftSerialNumberTextView"
        Android:layout_centerHorizontal="true"/>    
    <TextView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textSize="15px"
        Android:gravity="center"
        Android:layout_below="@id/userVersionTextViewNew"
        Android:id="@+id/dummyTextView"/>       
    <Button
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/loginButton"
        Android:text="Σύνδεση"
        Android:layout_centerHorizontal="true"
        Android:layout_below="@id/dummyTextView"
        Android:layout_weight="0.7"/>
    <Button
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/demoLoginButton"
        Android:text="Δοκιμαστική χρήση"
        Android:layout_centerHorizontal="true"
        Android:layout_below="@id/loginButton"
        Android:layout_weight="0.7"/>
</RelativeLayout>
13
iCantSeeSharp

Coba ini..

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_height="fill_parent" 
    Android:layout_width="fill_parent">
    <TextView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textSize="15px"  
        Android:id="@+id/userVersionTextViewNew"
        Android:gravity="center"
        Android:layout_centerVertical="true"/>
    <TextView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textSize="15px"
        Android:gravity="center"
        Android:layout_above="@id/userVersionTextViewNew"
        Android:id="@+id/userSoftSerialNumberTextView"/>
    <ImageView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:src="@drawable/logo_200"
        Android:layout_above="@id/userSoftSerialNumberTextView"
        Android:layout_centerHorizontal="true"/>    
    <TextView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textSize="15px"
        Android:gravity="center"
        Android:layout_below="@id/userVersionTextViewNew"
        Android:id="@+id/dummyTextView"/>      
    <LinearLayout  
        Android:layout_height="wrap_content"  
        Android:layout_width="fill_parent" 
        Android:gravity = "center_horizontal"
        Android:layout_below="@id/dummyTextView"
        Android:id="@+id/loginButtonLayout"
        Android:weightSum="1.0">  
        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/loginButton"
            Android:text="Σύνδεση"
            Android:layout_weight="0.7"/>
    </LinearLayout>
    <LinearLayout  
        Android:layout_height="wrap_content"  
        Android:layout_width="fill_parent" 
        Android:gravity = "center_horizontal"
        Android:layout_below="@id/loginButtonLayout"
        Android:weightSum="1.0">  
        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/demoLoginButton"
            Android:text="Δοκιμαστική χρήση"
            Android:layout_weight="0.7"/>
    </LinearLayout>
</RelativeLayout>
14
chetanmoswal

Masalahnya

Anda tidak dapat menggunakan parameter layout_weight pada RelativeLayout. Ini adalah parameter dari LinearLayout. Saya akan memberikan beberapa informasi lebih lanjut tentang perbedaan di bawah. Tetapi pertama-tama tentang solusi untuk pertanyaan ini

Solusi

Gunakan LinearLayout di mana Anda dapat memposisikan elemen dalam satu baris dengan distribusi berat. Jangan lupa untuk menggunakan lebar 0dp saat menambahkan layout_weights! Contoh di bawah ini menunjukkan distribusi berat 70/30.

<LinearLayout
Android:id="@+id/wrapper"
Android:layout_width="fill_parent" 
Android:layout_height="wrap_content"
Android:weightSum="1.0" >

    <Button
        Android:text="left" 
        Android:layout_width="0dp" 
        Android:layout_height="wrap_content" 
        Android:layout_weight=".70" /> 

    <Button
        Android:text="right" 
        Android:layout_width="0dp" 
        Android:layout_height="wrap_content" 
        Android:layout_weight=".30" />

</LinearLayout>

Semua ini dalam RelativeLayout yang sudah Anda miliki dalam kode Anda. Sisa dari jawaban ini adalah informasi latar belakang yang harus dibaca semua orang dengan pertanyaan ini untuk memahami apa yang mereka lakukan.

RelativeLayout

Setiap kali Anda memulai dengan tata letak dengan lebih dari satu elemen, saya menyarankan Anda untuk memilih RelativeLayout yang mendukung hal Linear. RelativeLayout sangat kuat dan memungkinkan Anda memposisikan elemen dalam hubungannya satu sama lain (kiri, di bawah, ...). Dalam kebanyakan kasus itu lebih dari yang Anda butuhkan.

Contoh dari dokumen pengembangan Android (percayalah semuanya ada di sana):

<?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"
    Android:paddingLeft="16dp"
    Android:paddingRight="16dp" >
    <EditText
        Android:id="@+id/name"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:hint="@string/reminder" />
    <Spinner
        Android:id="@+id/dates"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_below="@id/name"
        Android:layout_alignParentLeft="true"
        Android:layout_toLeftOf="@+id/times" />
    <Spinner
        Android:id="@id/times"
        Android:layout_width="96dp"
        Android:layout_height="wrap_content"
        Android:layout_below="@id/name"
        Android:layout_alignParentRight="true" />
    <Button
        Android:layout_width="96dp"
        Android:layout_height="wrap_content"
        Android:layout_below="@id/times"
        Android:layout_alignParentRight="true"
        Android:text="@string/done" />
</RelativeLayout>

LinearLayout

LinearLayout mungkin terlihat sangat mampu juga, tetapi untuk menyelesaikan semuanya hanya dengan Linear, Anda kemungkinan besar akan mulai membuat layout ini. Dan di situlah kinerja jelek itu didapat.

Lagi contoh dari dokumentasi pengembangan Android .

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:paddingLeft="16dp"
    Android:paddingRight="16dp"
    Android:orientation="vertical" >
    <EditText
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:hint="@string/to" />
    <EditText
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:hint="@string/subject" />
    <EditText
        Android:layout_width="fill_parent"
        Android:layout_height="0dp"
        Android:layout_weight="1"
        Android:gravity="top"
        Android:hint="@string/message" />
    <Button
        Android:layout_width="100dp"
        Android:layout_height="wrap_content"
        Android:layout_gravity="right"
        Android:text="@string/send" />
</LinearLayout>
29
hcpl

Saya tidak berpikir layout_weight berfungsi di dalam RelativeLayout. Mungkin Anda harus menambahkan LinearLayout di dalam RelativeLayout dan menggunakan layout_weight di dalamnya.

Juga ketika menggunakan layout_weight Anda biasanya harus memiliki lebar atau tinggi objek yang didefinisikan sebagai 0dp, jadi dalam kasus Anda seperti ini:

Android:layout_weight="0.7"
Android:layout_height="0dp"
6

Saya tahu bahwa pertanyaan ini sudah lama, tetapi hanya untuk seseorang yang mencari solusi:

Google memperkenalkan API baru bernama Android.support.percent

PercentRelativeLayout persis dengan kasus Anda:

<Android.support.percent.PercentRelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_height="fill_parent" 
    Android:layout_width="fill_parent">

    <!-- Other controls -->

    <Button
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/loginButton"
        Android:text="Σύνδεση"
        Android:layout_centerHorizontal="true"
        Android:layout_below="@id/dummyTextView"
        app:layout_widthPercent="70%"/>

    <!-- Other controls -->

</Android.support.percent.PercentRelativeLayout>
6
Oleksandr

layout_weight, berfungsi di LinearLayout sebagai induk. jadi saya pikir masalahnya ada di sana. Anda harus menggunakan campuran semua tata letak linier dan tata letak relatif untuk mencapai apa yang Anda butuhkan.

1
Yashwanth Kumar

Saya pikir Anda tidak harus mendefinisikan Android:layout_weight="1.0" di Layout relatif tag, jika Anda ingin mengatur panjang tombol selain "wrap_content" 

0
himanshu

Seperti @hcpl dengan benar disebutkan dalam jawabannya:

Anda tidak dapat menggunakan parameter layout_weight pada RelativeLayout. Ini adalah parameter dari LinearLayout.

Ya, dia benar! Tetapi pikirkan tentang dampak negatif pada kinerja disebabkan oleh tata letak bersarang.

Dengan diperkenalkannya ConstraintLayout, Anda dapat menyelesaikan masalah Anda tanpa LinearLayout bersarang. Anda cukup menempelkan dua pedoman vertikal dengan margin 15% dan 85% dan menempatkan tombol Anda di antara mereka.

 Layout Editor

Berikut kode sumber tata letak:

<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_height="match_parent"
    Android:layout_width="match_parent">

    <TextView
        Android:id="@+id/userVersionTextViewNew"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textSize="15sp"
        Android:text="userVersionTextViewNew"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/userSoftSerialNumberTextView"
        app:layout_constraintVertical_chainStyle="packed" />

    <TextView
        Android:id="@+id/userSoftSerialNumberTextView"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textSize="15sp"
        Android:text="userSoftSerialNumberTextView"
        app:layout_constraintTop_toBottomOf="@+id/userVersionTextViewNew"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/imageView" />

    <ImageView
        Android:id="@+id/imageView"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/logo_200"
        app:layout_constraintTop_toBottomOf="@+id/userSoftSerialNumberTextView"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/dummyTextView" />

    <TextView
        Android:id="@+id/dummyTextView"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textSize="15sp"
        Android:text="dummyTextView"
        app:layout_constraintTop_toBottomOf="@+id/imageView"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/loginButton" />

    <Button
        Android:id="@+id/loginButton"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:text="Σύνδεση"
        app:layout_constraintTop_toBottomOf="@+id/dummyTextView"
        app:layout_constraintLeft_toLeftOf="@+id/leftGuideline"
        app:layout_constraintRight_toLeftOf="@+id/rightGuideline"
        app:layout_constraintBottom_toTopOf="@+id/demoLoginButton" />

    <Button
        Android:id="@+id/demoLoginButton"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:text="Δοκιμαστική χρήση"
        app:layout_constraintTop_toBottomOf="@+id/loginButton"
        app:layout_constraintLeft_toLeftOf="@+id/leftGuideline"
        app:layout_constraintRight_toLeftOf="@+id/rightGuideline"
        app:layout_constraintBottom_toBottomOf="parent" />

    <Android.support.constraint.Guideline
        Android:id="@+id/leftGuideline"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        app:layout_constraintGuide_percent="0.15" />

    <Android.support.constraint.Guideline
        Android:id="@+id/rightGuideline"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        app:layout_constraintGuide_percent="0.85" />

</Android.support.constraint.ConstraintLayout>

Hasilnya, Anda mendapatkan tampilan ini:

 Result view

Anda dapat menemukan detail lebih lanjut di Membangun antarmuka dengan ConstraintLayout .

0
Eugene Brusov