web-dev-qa-db-ja.com

Androidウェイトを使用したボタン幅の相対レイアウト

layout_weightパラメータを使用してボタンの幅をレイアウト全体の幅の70%に設定しましたが、機能させるために重要な詳細が欠けているようです。

(別の解決策は、プログラムでdisplay.getWidth()を使用することですが、button.setWidth()で幅を設定することを選択した場合、.xmlがどのように見えるかわからないため、それも機能しません。 ])

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

これを試して..

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

問題

RelativeLayoutでlayout_weightパラメーターを使用することはできません。これらは、LinearLayoutからのパラメーターです。違いについては、後で詳しく説明します。しかし、最初にこの質問の解決策について

解決策

LinearLayoutを使用して、重みの分布で要素を一列に配置できます。 ただし、layout_weightsを追加するときに0dpの幅を使用することを忘れないでください!次の例は、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>

これらすべては、すでにコードに含まれているRelativeLayout内にあります。この回答の残りは、これらの質問を持つすべての人が何をしているかを理解するために読むべき背景情報です。

RelativeLayout

複数の要素を含むレイアウトから始める場合は常に、線形のものを優先してRelativeLayoutを使用することをお勧めします。 RelativeLayoutは非常に強力であり、要素を互いに相対的に配置できます(leftOf、below、...)。ほとんどの場合、それはあなたが必要とする以上のものです。

the Android開発ドキュメント の例(すべてあると思います):

<?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も非常に機能しているように見えるかもしれませんが、Linearのみですべてを並べ替えるには、これらのレイアウトをネストし始める可能性があります。そして、それはそれが醜いパフォーマンスを得るところです。

再び the 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

layout_weightRelativeLayout内では機能しないと思います。 LinearLayout内にRelativeLayoutを追加し、内部でlayout_weightを使用する必要があるかもしれません。

また、layout_weightを使用する場合、通常、オブジェクトの幅または高さを0dpとして定義する必要があるため、この場合は次のようになります。

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

私はこの質問が古いことを知っていますが、解決策を探している人のためだけです:

Googleは Android.support.percent という新しいAPIを導入しました

PercentRelativeLayoutまさにあなたのケース:

<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。LinearLayoutを親として機能します。だから私は問題がそこにあると思います。必要なものを実現するには、すべての線形レイアウトと相対レイアウトを組み合わせて使用​​する必要があります。

1
Yashwanth Kumar

Android:layout_weight="1.0" in Relative layoutタグ、ボタンの長さを設定したくない場合は"wrap_content"

0
himanshu

@hcplが彼の答えで正しく述べたように:

RelativeLayoutでlayout_weightパラメーターを使用することはできません。これらは、LinearLayoutからのパラメーターです。

うん、彼は正しいです!しかし、ネストされたレイアウトによって引き起こされる パフォーマンスへの悪影響 について考えてください。

ConstraintLayoutの導入により、ネストされたLinearLayoutなしで問題を解決できます。 15%と85%のマージンを持つ2つの垂直ガイドラインを貼り付け、それらの間にボタンを配置します。

Layout Editor

レイアウトのソースコードは次のとおりです。

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

その結果、次のビューが得られます。

Result view

詳細は ConstraintLayoutを使用したインターフェースの作成 を参照してください。

0
Eugene Brusov