我想在我的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>
答案 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_content
,GridLayout
将设置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列用于中小屏幕(如果这适用于您的游戏),或者使每个按钮的大小更小。
此外,您可以在应用程序中声明不支持小屏幕尺寸。如果你可以避免这种情况,那么这一点非常普遍,因为它确实从你的应用程序中排除了一些用户。