it-swarm.com.de

Android relatives Layout mit Tastenbreite nach Gewicht

Ich habe den layout_weight -Parameter verwendet, um die Breite der Schaltflächen auf 70% der gesamten Layoutbreite festzulegen, aber es scheint, als würde mir ein wichtiges Detail fehlen, damit es funktioniert.

(Eine andere Lösung wäre, programmgesteuert mit display.getWidth() zu arbeiten, aber es funktioniert auch nicht, da ich nicht weiß, wie meine .xml-Datei aussehen soll, wenn ich die Breite mit button.setWidth() festlegen möchte.)

<?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

Versuche dies..

<?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

Das Problem

Sie können die Parameter layout_weight nicht für RelativeLayout verwenden. Dies sind Parameter aus dem LinearLayout. Ich werde später noch einige Informationen zu den Unterschieden geben. Aber zuerst über die Lösung dieser Frage

Eine Lösung

Verwenden Sie ein LinearLayout, in dem Sie Elemente mit einer Gewichtsverteilung in einer Reihe positionieren können. Vergessen Sie nicht, die 0dp-Breite zu verwenden, wenn Sie layout_weights hinzufügen! Das folgende Beispiel zeigt eine Gewichtsverteilung von 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>

All dies im RelativeLayout, das Sie bereits in Ihrem Code hatten. Der Rest dieser Antwort besteht aus Hintergrundinformationen, die jeder mit diesen Fragen lesen sollte, um zu verstehen, was er tut.

RelativeLayout

Wann immer Sie mit einem Layout mit mehr als einem Element beginnen, empfehle ich Ihnen, ein RelativeLayout der linearen Sache vorzuziehen. Das RelativeLayout ist sehr leistungsfähig und ermöglicht es Ihnen, Elemente relativ zueinander zu positionieren (leftOf, unter, ...). In den meisten Fällen ist das mehr, als Sie jemals brauchen werden.

Ein Beispiel aus dem Android-Entwicklungsdokument (glauben Sie mir, es ist alles da):

<?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

Das LinearLayout mag auch sehr gut aussehen, aber um alles nur mit Linears zu sortieren, beginnen Sie wahrscheinlich, diese Layouts zu verschachteln. Und da wird es hässlich.

Wieder ein Beispiel aus der Android-Entwicklungsdokumentation .

<?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

Ich glaube nicht, dass layout_weight in einer RelativeLayout funktioniert. Vielleicht sollten Sie eine LinearLayout in die RelativeLayout einfügen und layout_weight verwenden.

Wenn Sie layout_weight verwenden, müssen Sie normalerweise entweder die Breite oder Höhe des Objekts als 0dp definieren. In Ihrem Fall also Folgendes:

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

Ich weiß, dass diese Frage alt ist, aber nur für jemanden, der nach einer Lösung sucht:

Google hat eine neue API namens Android.support.percent eingeführt.

PercentRelativeLayout genau dein Fall:

<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, arbeitet mit dem LinearLayout als übergeordnetes Element. Ich denke das Problem liegt also da. Sie müssen eine Mischung aus allen linearen und relativen Layouts verwenden, um das zu erreichen, was Sie benötigen.

1
Yashwanth Kumar

Ich denke, Sie sollten Android:layout_weight="1.0" nicht in Relatives Layout Tag definieren, wenn Sie die Länge der Schaltfläche anders als "wrap_content" festlegen möchten. 

0
himanshu

Als @hcpl in seiner Antwort richtig erwähnt:

Sie können die Parameter layout_weight nicht für RelativeLayout verwenden. Dies sind Parameter aus dem LinearLayout.

Ja, er hat recht! Denken Sie jedoch an negative Auswirkungen auf die Leistung , die durch verschachtelte Layouts verursacht werden.

Mit der Einführung von ConstraintLayout können Sie Ihr Problem ohne verschachteltes LinearLayout lösen. Sie fügen einfach zwei vertikale Hilfslinien mit 15% und 85% Rändern ein und platzieren Ihre Schaltflächen dazwischen.

Layout Editor

Hier ist der Layout-Quellcode:

<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>

Als Ergebnis erhalten Sie diese Ansicht:

Result view

Weitere Details finden Sie in Erstellen von Schnittstellen mit ConstraintLayout .

0
Eugene Brusov