创建独立于设备分辨率的按钮网格

时间:2014-07-21 13:36:56

标签: android button resolution dpi

我想在我的Android应用中创建一个Buttons的网格。问题是,当我在低分辨率设备上测试时,屏幕上会显示一些Buttons。我该如何解决这个问题?

这是我正在使用的布局:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:columnCount="4"
    android:orientation="horizontal">

    <Button
        android:text=""
        android:id="@+id/b0"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b1"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b2"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b3"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b4"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b5"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b6"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b7"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b8"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b9"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b10"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b11"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b12"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b13"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b14"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <Button
        android:text=""
        android:id="@+id/b15"
        android:padding="20dp"
        android:layout_margin="10dp" />

    <TextView
        android:id="@+id/text1"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:textSize="30sp"
        android:text="  Taget:-" />

    <TextView
        android:id="@+id/tar"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:textSize="30sp"
        android:text="" />

    <TextView
        android:id="@+id/text2"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:textSize="30sp"
        android:text="  Current:-" />

    <TextView
        android:id="@+id/cur"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:textSize="30sp"
        android:text="" />

    <TextView
        android:id="@+id/text3"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:textSize="20sp"
        android:text="  TimeLeft:-" />

    <TextView
        android:id="@+id/tim"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:textSize="20sp"
        android:text="" />


</GridLayout>

2 个答案:

答案 0 :(得分:1)

使用GridLayout时,您需要指定Views的确切位置以及它们应该有多大。尝试这样的事情:

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="2"
    android:rowCount="2"
    android:orientation="horizontal">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_column="0"
        android:layout_row="0"
        android:layout_columnSpan="2"
        android:layout_rowSpan="2" />

    ...

</GridLayout>

要定义GridLayout上使用这两个属性的行数和列数:

  • android:columnCount
  • android:rowCount

您可以使用以下两个属性在GridLayout中定义View的位置:

  • android:layout_column
  • android:layout_row

您可以定义View跨越这两个属性的行数或列数:

  • android:layout_rowSpan
  • android:layout_columnSpan

请注意,GridLayout仅添加了API级别14!如果要在早期版本中使用GridLayout,则需要使用支持库中的GridLayout:

<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    ...    

</android.support.v7.widget.GridLayout>

另请注意,应该为每个Button硬编码固定大小。将高度和宽度设置为wrap_contentGridLayout将设置Buttons的大小。

您可以使用资源选择器减少显示的列数:

例如,在 res / values / dimens.xml 中定义它,这样较小的设备只使用两列:

<dimen name="column_count">2</dimen>

res / values-w350dp / dimens.xml 中,您可以使用更大的值定义相同的dimen资源:

<dimen name="column_count">3</dimen>

w350dp 表示宽度大于350dp的所有设备都使用3列而不是默认值2。

要完成这项工作,您当然需要将此维度资源设置为columnCount上的GridLayout

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="@dimen/column_count"
    android:rowCount="2"
    android:orientation="horizontal">

    ...

</GridLayout>

答案 1 :(得分:1)

首先,supporting multiple screens上的Android开发者页面是关于此主题的非常全面的指南。

简而言之,使用dp而不是直接像素,你就在正确的轨道上,因为Android可以很好地扩展大部分内容。然而,这个系统在实践中并不总是完美的。解决此问题的一种方法是为不同的屏幕尺寸创建不同的布局。

  

默认情况下,Android会调整应用程序布局的大小以适应当前的设备屏幕。在大多数情况下,这很好。在其他情况下,您的UI可能看起来不太好,可能需要针对不同的屏幕尺寸进行调整。例如,在较大的屏幕上,您可能需要调整某些元素的位置和大小以利用额外的屏幕空间,或者在较小的屏幕上,您可能需要调整大小以使所有内容都适合屏幕。

     

可用于提供特定于大小的资源的配置限定符是small,normal,large和xlarge。例如,超大屏幕的布局应该在layout-xlarge /.

例如,您可以使用类似的布局,只有3列而不是4列用于中小屏幕(如果这适用于您的游戏),或者使每个按钮的大小更小。

此外,您可以在应用程序中声明不支持小屏幕尺寸。如果你可以避免这种情况,那么这一点非常普遍,因为它确实从你的应用程序中排除了一些用户。