tangguo

如何使GridLayout适合屏幕大小

android

GridLayoutAPI文档是非常难学......
有没有谁可以教我怎么一组孩子的任何一个Views到有类似的“权重”LinearLayout

现在看来,所有内容都放在了左侧,
我已经尝试了很多次,但仍然无法像每个屏幕一样将其变成屏幕宽度的一半。

编辑:我不知道当所有的小孩都可以做些什么wrap_content… …即使我想以特定的尺寸设置一些图像,此类也可以帮助我做ImageView wrap_content....它无法正常运行,我错过了一些设置吗?!?


阅读 560

收藏
2020-10-26

共1个答案

小编典典

注意:随着Android“ Lollipop”5的推出,水平线下方的信息不再准确,因为自API级别21起GridLayout 就适应了权重原则。

引用自Javadoc:

多余的空间分布

从API 21开始,GridLayout的剩余空间分布符合重量原则。如果未指定权重,则遵循先前的约定,并且如果列和行的视图在其组内指定某种形式的对齐方式,则将其视为灵活的。因此,视图的灵活性受其对齐方式的影响,对齐方式通常通过设置孩子的布局参数的重力属性来定义。如果沿给定的轴定义了重量或对齐方式,则该组件将在该方向上具有柔性。如果未设置权重或对齐方式,则假定该组件不灵活。

同一行或同一列组中的多个组件被视为并行运行。仅当其中的所有组件都是灵活的时,此类组才是灵活的。位于公共边界两侧的行和列组将被视为串联操作。如果这两个元素中的一个是柔性的,则由这两个元素组成的复合组是柔性的。

要拉伸列,请确保其中的所有组件都定义了重量或重力。为防止色谱柱拉伸,请确保色谱柱中的一个组件未定义重量或重力。

当灵活性原理不能完全消除歧义时,GridLayout的算法会偏向于更靠近其右边缘和下边缘的行和列。更精确地说,GridLayout将其每个布局参数都视为一组变量的约束,这些变量定义了沿给定轴的网格线。在布局期间,GridLayout求解约束,以便将唯一解返回到所有其他变量均小于或等于任何其他有效解中的对应值的约束。

还值得注意的是android.support.v7.widget.GridLayout包含相同的信息。不幸的是,它没有提到引入的支持库版本,但是添加功能的提交可以追溯到2014年7月。2014年11月,权重计算方面的改进和错误已修复。

为了安全起见,请确保导入最新版本的gridlayout-v7库。

正如您所描述的,“权重”原则并不存在GridLayout。该限制在文档中明确提到;摘录如下。话虽这么说,但仍有一些可能性将“重力”用于多余的空间分配。建议您通读链接文档。

局限性

GridLayout不支持按权重定义的权重原理。通常,因此,不可能将GridLayout配置为在多个行或列之间以不小的比例分配多余的空间。但是,可以按以下方式容纳一些常见用例。在单元组中的组件周围放置相等的空间;使用CENTER对齐方式(或重力)。完全控制行或列中多余空间的分配;使用LinearLayout子视图将组件保存在关联的单元格组中。使用这些技术中的任何一种时,请记住,单元格组可以定义为重叠。

有关示例和一些实用的指导,请查看去年的博客文章中介绍了GridLayoutwidget。

编辑:我不认为有一种基于xml的方法将Google Play应用中的图块缩放为“正方形”或“矩形”,其长度是这些正方形长度的两倍。但是,如果以编程方式构建布局,则肯定是可能的。要真正做到这两项,您真正需要知道的就是设备的屏幕尺寸。

在Google Play应用中平铺布局的快速(非常!)逼近之下。

Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
int screenWidth = size.x;
int screenHeight = size.y;
int halfScreenWidth = (int)(screenWidth *0.5);
int quarterScreenWidth = (int)(halfScreenWidth * 0.5);

Spec row1 = GridLayout.spec(0, 2);
Spec row2 = GridLayout.spec(2);
Spec row3 = GridLayout.spec(3);
Spec row4 = GridLayout.spec(4, 2);

Spec col0 = GridLayout.spec(0);
Spec col1 = GridLayout.spec(1); 
Spec colspan2 = GridLayout.spec(0, 2);

GridLayout gridLayout = new GridLayout(this);
gridLayout.setColumnCount(2);
gridLayout.setRowCount(15);

TextView twoByTwo1 = new TextView(this);
GridLayout.LayoutParams first = new GridLayout.LayoutParams(row1, colspan2);
first.width = screenWidth;
first.height = quarterScreenWidth * 2;
twoByTwo1.setLayoutParams(first);
twoByTwo1.setGravity(Gravity.CENTER);
twoByTwo1.setBackgroundColor(Color.RED);
twoByTwo1.setText("TOP");
twoByTwo1.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByTwo1, first);

TextView twoByOne1 = new TextView(this);
GridLayout.LayoutParams second = new GridLayout.LayoutParams(row2, col0);
second.width = halfScreenWidth;
second.height = quarterScreenWidth;
twoByOne1.setLayoutParams(second);
twoByOne1.setBackgroundColor(Color.BLUE);
twoByOne1.setText("Staff Choices");
twoByOne1.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByOne1, second);

TextView twoByOne2 = new TextView(this);
GridLayout.LayoutParams third = new GridLayout.LayoutParams(row2, col1);
third.width = halfScreenWidth;
third.height = quarterScreenWidth;
twoByOne2.setLayoutParams(third);
twoByOne2.setBackgroundColor(Color.GREEN);
twoByOne2.setText("Games");
twoByOne2.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByOne2, third);

TextView twoByOne3 = new TextView(this);
GridLayout.LayoutParams fourth = new GridLayout.LayoutParams(row3, col0);
fourth.width = halfScreenWidth;
fourth.height = quarterScreenWidth;
twoByOne3.setLayoutParams(fourth);
twoByOne3.setBackgroundColor(Color.YELLOW);
twoByOne3.setText("Editor's Choices");
twoByOne3.setTextAppearance(this, android.R.style.TextAppearance_Large_Inverse);
gridLayout.addView(twoByOne3, fourth);

TextView twoByOne4 = new TextView(this);
GridLayout.LayoutParams fifth = new GridLayout.LayoutParams(row3, col1);
fifth.width = halfScreenWidth;
fifth.height = quarterScreenWidth;
twoByOne4.setLayoutParams(fifth);
twoByOne4.setBackgroundColor(Color.MAGENTA);
twoByOne4.setText("Something Else");
twoByOne4.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByOne4, fifth);

TextView twoByTwo2 = new TextView(this);
GridLayout.LayoutParams sixth = new GridLayout.LayoutParams(row4, colspan2);
sixth.width = screenWidth;
sixth.height = quarterScreenWidth * 2;
twoByTwo2.setLayoutParams(sixth);
twoByTwo2.setGravity(Gravity.CENTER);
twoByTwo2.setBackgroundColor(Color.WHITE);
twoByTwo2.setText("BOTOM");
twoByTwo2.setTextAppearance(this, android.R.style.TextAppearance_Large_Inverse);
gridLayout.addView(twoByTwo2, sixth);
2020-10-26