29667


ログインフォームを作っているんですが、ご覧のように入力フィールドとボタンの幅が少しずれています：

[![画像の説明をここに入力](https://i.stack.imgur.com/tk4Py.png)](https://i.stack.imgur.com/tk4Py.png)

フィールドとボタンの`margin`の設定は同じです、また`layout_align`で合わせてみました。

[code]

    <EditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_below="@+id/loginField"
       android:layout_centerHorizontal="true"
    
       android:layout_marginTop="15dp"
       android:layout_marginLeft="10dp"
       android:layout_marginRight="10dp"
       android:paddingBottom="10dp"
       android:paddingTop="10dp"
       android:paddingLeft="10dp"
       android:paddingRight="10dp"
    
       <!-- 次は当質問に関係ない設定・・・ -->
    />
    
    <Button
    
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_below="@+id/loginPassword"
    
       android:layout_marginTop="20dp"
    
       android:layout_alignRight="@+id/loginPassword"
       android:layout_alignEnd="@+id/loginPassword"
       android:layout_alignLeft="@+id/loginPassword"
       android:layout_alignStart="@+id/loginPassword" 
    
       <!-- 次は当質問に関係ない設定・・・ -->
    />
    
[/code]

小さいですからほとんど見えないですけど、フィールドに[こちらの解決](https://stackoverflow.com/questions/16161448/how-
to-make-layout-with-rounded-corners)に基づいて丸角を作りました：

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="#FFFFFF"/>
        <corners android:radius="2dip"/>
        <padding android:left="0dip" android:top="0dip" android:right="0dip" android:bottom="0dip" />
    </shape>
    
[/code]

フィールドとボタンの幅をぴったり合わせる事が出来なかった理由は何でしょうか。


CC BY-SA 3.0
2016-10-18T09:42:48.427
29662
2016-10-19T12:53:04.843
2017-05-23T12:38:55.307
-1
16876
question
android android-studio xml
Android: 入力フィールドとボタンの幅をぴったり合わせる


Buttonにデフォルトで設定されている背景には、タッチ領域の確保のために若干空白が設けられています。これがズレの原因でしょう。  
デフォルトで設定されているbackgroundは `@drawable/btn_default_material` で、ソースを見ると

[code]

    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?attr/colorControlHighlight">
        <item android:drawable="@drawable/btn_default_mtrl_shape" />
    </ripple>
    
[/code]

<https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_default_material.xml>

となっており、内部でさらに `@drawable/btn_default_mtrl_shape` を使用しています。  
`@drawable/btn_default_mtrl_shape`のソースを見てみると、

[code]

    <inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetLeft="@dimen/button_inset_horizontal_material"
       android:insetTop="@dimen/button_inset_vertical_material"
       android:insetRight="@dimen/button_inset_horizontal_material"
       android:insetBottom="@dimen/button_inset_vertical_material">
        (以下略)
    
[/code]

<https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_default_mtrl_shape.xml>

とあり、InsetDrawableを生成しています。(InsetDrawableについては別途調べてみてください)  
ここの、inset~~に設定されている値がButtonの上下左右に設定されている空白の正体なので、Buttonの左右に合わせたいのであれば、この値分だけEditTextのサイズをズラせば良いでしょう。  
ずらし方はいくつかあるかと思いますが、EditTextの背景に設定しているxmlに対してButtonと同様にinsetで囲んであげるのが一番ラクかと思います。(色は見づらかったので少し変えました)

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:insetBottom="@android:dimen/button_inset_vertical_material"
        android:insetLeft="@android:dimen/button_inset_horizontal_material"
        android:insetRight="@android:dimen/button_inset_horizontal_material"
        android:insetTop="@android:dimen/button_inset_vertical_material">
    
        <shape>
            <solid android:color="#ffcccc" />
            <corners android:radius="2dip" />
            <padding
                android:bottom="0dip"
                android:left="0dip"
                android:right="0dip"
                android:top="0dip" />
        </shape>
    </inset>
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/gCHD5.png)](https://i.stack.imgur.com/gCHD5.png)


CC BY-SA 3.0
2016-10-18T11:38:19.800
29667
2016-10-18T11:38:19.800
7655
29662
answer