Search code examples
androidgrid-layout

GridLayout buttons sizes are different


So I am doing a simple game app, that has colorful buttons with answers in them. Everything works fine but I have some problems with the sizes of buttons in GridLayout. I tried searching the answer in other posts but couldn't make the buttons sized evenly. It looks fine on the emulator, but not on my device (API 21). Yes, I tried changing button width to "wrap_content".

Real device: https://i.sstatic.net/mtC25.jpg

Emulator: https://i.sstatic.net/sXTAG.png

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"
tools:context="com.example.adam.braintrainer.MainActivity">

<Button
    android:id="@+id/goButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="false"
    android:layout_alignParentStart="false"
    android:layout_alignParentTop="false"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:background="@android:color/holo_blue_dark"
    android:onClick="goButton"
    android:padding="30dp"
    android:text="START!"
    android:textSize="36sp"
    android:visibility="visible"
    tools:gravity="center_vertical|center_horizontal|center" />

<RelativeLayout
    android:id="@+id/allStuff"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:visibility="invisible">


    <TextView
        android:id="@+id/answer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="20dp"
        android:text="Correct"
        android:textSize="20sp"
        android:visibility="invisible" />

    <Button
        android:id="@+id/again"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="65dp"
        android:onClick="playAgain"
        android:padding="10dp"
        android:text="PLAY AGAIN"
        android:visibility="invisible" />

    <TextView
        android:id="@+id/timer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_margin="15dp"
        android:background="@android:color/holo_orange_light"
        android:padding="15dp"
        android:text="30s"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/score"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_margin="15dp"
        android:background="@color/colorAccent"
        android:padding="15dp"
        android:text="0/0"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/suma"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/timer"
        android:layout_alignBottom="@+id/timer"
        android:layout_centerHorizontal="true"
        android:text="10+13"
        android:textSize="30dp" />

    <GridLayout
        android:id="@+id/gridLayout"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:layout_alignBottom="@+id/again"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:columnCount="2"
        android:rowCount="2">


        <Button
            android:id="@+id/button4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:background="@color/colorPrimary"
            android:onClick="pressed"
            android:tag="0"
            android:text="Button"
            android:textSize="20sp" />

        <Button
            android:id="@+id/button3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:background="@android:color/holo_blue_dark"
            android:onClick="pressed"
            android:tag="1"
            android:text="Button"
            android:textSize="20sp" />

        <Button
            android:id="@+id/button2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:background="@android:color/holo_green_light"
            android:onClick="pressed"
            android:tag="2"
            android:text="Button"
            android:textSize="20sp" />

        <Button
            android:id="@+id/button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:background="@android:color/holo_red_light"
            android:onClick="pressed"
            android:tag="3"
            android:text="Button"
            android:textSize="20sp" />
    </GridLayout>

</RelativeLayout>


Solution

  • Looking at your layout, I don't see any problem. I don't have your exact device, but I couldn't reproduce the issue.

    However, one way to solve it would be to use ConstraintLayout instead of GridLayout. This has the added benefit of allowing you to get evenly sized buttons without weight (which GridLayout only supports on API 21+).

    Here's a ConstraintLayout that does the same thing as your grid:

        <android.support.constraint.ConstraintLayout
            android:id="@+id/gridLayout"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignBottom="@+id/again">
    
            <Button
                android:id="@+id/button4"
                android:tag="0"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:textSize="20sp"
                android:text="Button"
                android:background="@color/colorPrimary"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toLeftOf="@+id/button3"
                app:layout_constraintBottom_toTopOf="@+id/button2"/>
    
            <Button
                android:id="@+id/button3"
                android:tag="1"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:textSize="20sp"
                android:text="Button"
                android:background="@android:color/holo_blue_dark"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/button4"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintBottom_toTopOf="@+id/button"/>
    
            <Button
                android:id="@+id/button2"
                android:tag="2"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:textSize="20sp"
                android:text="Button"
                android:background="@android:color/holo_green_light"
                app:layout_constraintTop_toBottomOf="@+id/button4"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toLeftOf="@+id/button"
                app:layout_constraintBottom_toBottomOf="parent"/>
    
            <Button
                android:id="@+id/button"
                android:tag="3"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:textSize="20sp"
                android:text="Button"
                android:background="@android:color/holo_red_light"
                app:layout_constraintTop_toBottomOf="@+id/button3"
                app:layout_constraintLeft_toRightOf="@+id/button2"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"/>
    
        </android.support.constraint.ConstraintLayout>
    

    If you wanted to get really into it, you could probably replace your entire layout with a single top-level ConstraintLayout and avoid all view nesting. But you can start with just this.